如何跳过 json4s 中字段的反序列化

HowTo skip deserialization for a field in json4s

这是我的 json:

{
  "stringField" : "whatever",
  "nestedObject": { "someProperty": "someValue"}
}

我想把它映射到

case class MyClass(stringField: String, nestedObject:String)

nestedObject 不应反序列化,我希望 json4s 将其保留为字符串。

结果实例应该是:

val instance = MyClass(stringField="whatever", nestedObject= """ { "someProperty": "someValue"} """)

在json4秒内不明白怎么做。

您可以定义自定义序列化程序:

case object MyClassSerializer extends CustomSerializer[MyClass](f => ( {
  case jsonObj =>
    implicit val format = org.json4s.DefaultFormats
    val stringField = (jsonObj \ "stringField").extract[String]
    val nestedObject = compact(render(jsonObj \ "nestedObject"))

    MyClass(stringField, nestedObject)
}, {
  case myClass: MyClass =>
    ("stringField" -> myClass.stringField) ~
      ("nestedObject" -> myClass.nestedObject)
}
))

然后将其添加到默认格式化程序:

implicit val format = org.json4s.DefaultFormats + MyClassSerializer
println(parse(jsonString).extract[MyClass])

将输出:

MyClass(whatever,{"someProperty":"someValue"})

代码 运行 在 Scastie