【问题标题】:HowTo skip deserialization for a field in json4s如何跳过 json4s 中字段的反序列化
【发布时间】:2021-04-22 00:08:13
【问题描述】:

这是我的 json:

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

我想把它映射到

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

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

结果实例应该是:

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

不明白json4s中怎么做。

【问题讨论】:

  • 如果你不限于使用 json4s 那就试试 jsoniter-scala。它支持读取原始 JSON 值而无需解析它们的能力,例如 here。此外,jsoniter-scala 在运行时更安全、更高效。

标签: json scala json4s


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2015-07-01
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多