json4s:无法用重命名的字段解析 JSON
json4s: unable to parse JSON with renamed field
我需要序列化然后反序列化 case class 对象,其字段 "name"
来自 JSON,它具有 "animalname"
字段而不是 "name"
。序列化工作正常,但反序列化不行。我将 FieldSerializer 与 renameTo()
和 renameFrom()
:
一起使用
import org.json4s._
import org.json4s.FieldSerializer._
import org.json4s.jackson.Serialization._
case class WildDog(name: String)
val dogSerializer = FieldSerializer[WildDog](
renameTo("name", "animalname"),
renameFrom("animalname", "name"))
implicit val formats = DefaultFormats + dogSerializer
// serialize
val json = write(WildDog("beefy")) // {"animalname":"beefy"}, as expected
// try to deserialize
val dog = parse(json).extract[WildDog] // expected: Dog("beefy")
实际上,extract() 抛出异常:
org.json4s.package$MappingException: No usable value for name
Did not find value which can be converted into java.lang.String
at org.json4s.reflect.package$.fail(ws.sc:94)
at org.json4s.Extraction$ClassInstanceBuilder.org$json4s$Extraction$ClassInstanceBuilder$$buildCtorArg(ws.sc:409)
at org.json4s.Extraction$ClassInstanceBuilder$$anonfun.apply(ws.sc:417)
at org.json4s.Extraction$ClassInstanceBuilder$$anonfun.apply(ws.sc:417)
at scala.collection.TraversableLike$$anonfun$map.apply(ws.sc:240)
at scala.collection.TraversableLike$$anonfun$map.apply(ws.sc:240)
at scala.collection.mutable.ResizableArray$class.foreach(ws.sc:55)
at scala.collection.mutable.ArrayBuffer.foreach(ws.sc:43)
at scala.collection.TraversableLike$class.map(ws.sc:240)
at scala.collection.AbstractTraversable.map(ws.sc:101)
at org.json4s.Extraction$ClassInstanceBuilder.org$json4s$Extraction$ClassInstanceBuilder$$instantiate(ws.sc:417)
at org.json4s.Extraction$ClassInstanceBuilder$$anonfun$result.apply(ws.sc:445)
at org.json4s.Extraction$ClassInstanceBuilder$$anonfun$result.apply(ws.sc:442)
at org.json4s.Extraction$.org$json4s$Extraction$$customOrElse(ws.sc:454)
at org.json4s.Extraction$ClassInstanceBuilder.result(ws.sc:442)
at org.json4s.Extraction$.extract(ws.sc:304)
at org.json4s.Extraction$.extract(ws.sc:38)
at org.json4s.ExtractableJsonAstNode.extract(ws.sc:17)
如何正确反序列化此 JSON?
更新:我使用 Scala 2.10,json4s 3.2.5。
更新 2:我将此 Maven 依赖项用于 json4s:
<dependency>
<groupId>org.json4s</groupId>
<artifactId>json4s-jackson_2.10</artifactId>
<version>3.2.5</version>
</dependency>
尝试 val dog = read[WildDog](json)
而不是 val dog = parse(json).extract[WildDog]
github 页面 - https://github.com/json4s/json4s 还有其他一些很好的示例。
编辑:
Working versions:
Scala 2.10 && org.json4s.jackson >= 3.5.0
Scala 2.11 && org.json4s.jackson >= 3.2.5
Scala 2.10之前的版本我没有查过,但是我用3.2.5的时候出现异常
另外,我可以让 val dog = parse(json).extract[WildDog]
工作,但你必须导入 JsonMethods
-> import org.json4s.jackson.JsonMethods.parse
我需要序列化然后反序列化 case class 对象,其字段 "name"
来自 JSON,它具有 "animalname"
字段而不是 "name"
。序列化工作正常,但反序列化不行。我将 FieldSerializer 与 renameTo()
和 renameFrom()
:
import org.json4s._
import org.json4s.FieldSerializer._
import org.json4s.jackson.Serialization._
case class WildDog(name: String)
val dogSerializer = FieldSerializer[WildDog](
renameTo("name", "animalname"),
renameFrom("animalname", "name"))
implicit val formats = DefaultFormats + dogSerializer
// serialize
val json = write(WildDog("beefy")) // {"animalname":"beefy"}, as expected
// try to deserialize
val dog = parse(json).extract[WildDog] // expected: Dog("beefy")
实际上,extract() 抛出异常:
org.json4s.package$MappingException: No usable value for name
Did not find value which can be converted into java.lang.String
at org.json4s.reflect.package$.fail(ws.sc:94)
at org.json4s.Extraction$ClassInstanceBuilder.org$json4s$Extraction$ClassInstanceBuilder$$buildCtorArg(ws.sc:409)
at org.json4s.Extraction$ClassInstanceBuilder$$anonfun.apply(ws.sc:417)
at org.json4s.Extraction$ClassInstanceBuilder$$anonfun.apply(ws.sc:417)
at scala.collection.TraversableLike$$anonfun$map.apply(ws.sc:240)
at scala.collection.TraversableLike$$anonfun$map.apply(ws.sc:240)
at scala.collection.mutable.ResizableArray$class.foreach(ws.sc:55)
at scala.collection.mutable.ArrayBuffer.foreach(ws.sc:43)
at scala.collection.TraversableLike$class.map(ws.sc:240)
at scala.collection.AbstractTraversable.map(ws.sc:101)
at org.json4s.Extraction$ClassInstanceBuilder.org$json4s$Extraction$ClassInstanceBuilder$$instantiate(ws.sc:417)
at org.json4s.Extraction$ClassInstanceBuilder$$anonfun$result.apply(ws.sc:445)
at org.json4s.Extraction$ClassInstanceBuilder$$anonfun$result.apply(ws.sc:442)
at org.json4s.Extraction$.org$json4s$Extraction$$customOrElse(ws.sc:454)
at org.json4s.Extraction$ClassInstanceBuilder.result(ws.sc:442)
at org.json4s.Extraction$.extract(ws.sc:304)
at org.json4s.Extraction$.extract(ws.sc:38)
at org.json4s.ExtractableJsonAstNode.extract(ws.sc:17)
如何正确反序列化此 JSON?
更新:我使用 Scala 2.10,json4s 3.2.5。
更新 2:我将此 Maven 依赖项用于 json4s:
<dependency>
<groupId>org.json4s</groupId>
<artifactId>json4s-jackson_2.10</artifactId>
<version>3.2.5</version>
</dependency>
尝试 val dog = read[WildDog](json)
而不是 val dog = parse(json).extract[WildDog]
github 页面 - https://github.com/json4s/json4s 还有其他一些很好的示例。
编辑:
Working versions:
Scala 2.10 && org.json4s.jackson >= 3.5.0
Scala 2.11 && org.json4s.jackson >= 3.2.5
Scala 2.10之前的版本我没有查过,但是我用3.2.5的时候出现异常
另外,我可以让 val dog = parse(json).extract[WildDog]
工作,但你必须导入 JsonMethods
-> import org.json4s.jackson.JsonMethods.parse