首页 > 解决方案 > 如何跳过 json4s 中字段的反序列化

问题描述

这是我的json:

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

我想把它映射到

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

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

结果实例应该是:

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

不明白如何在json4s中做到这一点。

标签: jsonscalajson4s

解决方案


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

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运行的代码


推荐阅读