[英]json4s - Partially deserialize to a case class
I have this JSON object 我有这个JSON对象
{
"name": "Chaitanya",
"addresses": [
{ "street": "20 ABC", "apt": "10" },
{ "street": "10 XYZ", "apt": "D3" }
]
}
Which I'm trying to deserialize into a following case class: 我正在尝试反序列化为以下案例类:
case class Person(
name: Option[String] = None,
addresses: Option[Seq[String]] = Some(Seq.empty)
)
addresses
field in the above case class is sequence of String where as in actual JSON it's an array of objects. 上述案例类中的
addresses
字段是String的序列,其中在实际JSON中,它是一个对象数组。 When I deserialize and serialize it back using: 当我反序列化并序列化回使用:
implicit val formats = Serialization.formats(NoTypeHints)
val parsed = parse(data).extractOpt[Person]
val str = write( parsed )
I see: { "name":"Chaitanya", "addresses":[] }
我看到:
{ "name":"Chaitanya", "addresses":[] }
Is there any way I can tell json4s to keep those json objects stringified and not to parse them. 有什么办法可以告诉json4s将那些json对象保持字符串化,而不是对其进行解析。 Where I can expect it to be array of stingified json objects:
在哪里可以预料到它是数组化的json对象:
{
"name": "Chaitanya",
"addresses": [
"{\"street\":\"20 ABC\",\"apt\":\"10\"}",
"{\"street\":\"10 XYZ\",\"apt\":\"D3\"}"
]
}
Is there any way I can do it using custom serializer or type hint? 有什么办法可以使用自定义序列化程序或类型提示吗?
If you don't want them deserialized to a string you could always declare them as Json 如果您不希望它们反序列化为字符串,则可以始终将它们声明为Json。
case class Person(
name: Option[String] = None,
addresses: Option[Json/JsArray/JsObject/JsWhatever] = Some(Seq.empty)
)
Just leaving a better solution here that I ended up using. 只是在这里留下了我最终使用的更好的解决方案。 As @shane-delmore mentioned you can get away using Json/JsArray/JsObject/JsWhatever.
正如@ shane-delmore所提到的,您可以使用Json / JsArray / JsObject / JsWhatever摆脱困境。 If you don't want to use any JSON4S specific types in your case class definitions you can create the custom serializer:
如果您不想在案例类定义中使用任何特定于JSON4S的类型,则可以创建自定义序列化器:
// Serializer
// Converts JObject to stringified JSON blob
val serializer: PartialFunction[JValue, String] = {
case jObj: JObject =>
implicit val formats = Serialization.formats(NoTypeHints)
write(jObj)
}
// Deserializer
// Converts String into JString
val deserializer: PartialFunction[Any, JValue] = {
case x: String => JString(x)
}
class JSONBlobSerializer extends CustomSerializer[String]( _ => (
serializer,
deserializer
))
Using the above custom serializer you can keep the part of JSON stringified 使用上述自定义序列化程序,您可以使JSON部分保持字符串化
implicit val formats = Serialization.formats(NoTypeHints) + new JSONBlobSerializer()
write( parse( data ).extract[Person] )
results in: 结果是:
{
"name": "Chaitanya",
"addresses": [
"{\"street\":\"20 ABC\",\"apt\":\"10\"}",
"{\"street\":\"10 XYZ\",\"apt\":\"D3\"}"
]
}
As expected. 如预期的那样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.