Scala Option的Jackson JSON反序列化[AnyVal]

时间:2019-06-29 14:17:00

标签: json scala jackson

我想在有一些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包装了像intlong这样的原始类型,则... 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

0 个答案:

没有答案