我想在有一些Option[_ <: AnyVal]
类的Scala案例类中使用Jackson来反序列化JSON。
我知道还有很多其他专门针对Scala的序列化器,但是这里的要求是使用Jackson。
我找到了要尝试的方法:https://github.com/FasterXML/jackson-module-scala/wiki/FAQ
以下将起作用:
case class MyValue @JsonCreator() (@(JsonValue @getter) value: Int) extends AnyVal
case class MyWrapper(@JsonDeserializer(contentAs = classOf[MyValue]) myInt: Option[MyValue])
val mapper = new ObjectMapper()
mapper.registerModule(new DefaultScalaModule)
mapper.readValue("{\"myInt\": 5}", classOf[MyWrapper])
但是,如果MyValue
包裹了String
,那么除非我将contentAs
更改为String
,否则它将失败:
case class MyValue @JsonCreator() (@(JsonValue @getter) value: String) extends AnyVal
case class MyWrapper(@JsonDeserializer(contentAs = classOf[String]) myInt: Option[MyValue])
如果MyValue
包装了像int
,long
这样的原始类型,则... contentAs
应该是MyValue
,否则应该是其包装器的类型。文档中没有提及任何内容,这是我在玩耍时想到的。
我的问题是-这里的规则是什么?我什至正确地做到了?
编辑:
我一直在玩耍,结果证明我根本不需要@JsonDeserializer
-这与Wiki的建议相反……任何人都可以找到答案吗? / p>
似乎您只需要AnyVal
类上的那些:
case class MyValue @JsonCreator() (@(JsonValue @getter) value: Int) extends AnyVal
case class MyRefValue @JsonCreator() (@(JsonValue @getter) value: BigDecimal) extends AnyVal