我正在编写一个 Scala 应用程序,需要序列化和反序列化 JSON。某些 JSON 对象具有超过 22 个字段,因此我无法使用案例类(并且也无法更改格式)。我找到的所有 Scala JSON 库都只能(轻松地)与案例类一起使用,而不是与普通类一起使用。
鉴于此,将大型 JSON 对象(具有超过 22 个字段)反序列化为 Scala 非 case 类的最简单方法是什么?它不一定是完全自动的,但理想情况下,我正在寻找比反序列化到 Map[String, Any] 并手动执行所有操作更轻松的方法。
更新:幸运的是,现在可以使用 Json4s 和 Jackson 使用字段序列化器来完成我想要的操作,如下所示:
implicit val formats = DefaultFormats + FieldSerializer[MyNonCaseClass]()
val myNonCaseClassObject = Serialization.read[MyNonCaseClass](jsonString)
根据下面的要求,这是一个更完整的示例:
import org.json4s.jackson.Serialization
import org.json4s._
import scala.util.Try
object JSONUtil {
implicit val formats = DefaultFormats + FieldSerializer[MyNonCaseClass]() + FieldSerializer[MyOtherNonCaseClass](ignore("someUnwantedFieldName") orElse ignore("anotherFieldToIgnore")) + ...
def toJSON(objectToWrite: AnyRef): String = Serialization.write(objectToWrite)
def fromJSONOption[T](jsonString: String)(implicit mf: Manifest[T]): Option[T] = Try(Serialization.read(jsonString)).toOption
}
那么用法就是:
val jsonString = JSONUtil.toJSON(myObject)
val myNewObject: Option[MyClass] = JSONUtil.fromJSONOption[MyClass](aJsonString)
对于要序列化的每个非案例类,您都需要一个 FieldSerializer。此外,在定义类时,JSON 中可能缺少的所有内容都需要定义为选项。
SBT:
"org.json4s" %% "json4s-jackson" % "3.2.6"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)