前言
我想将json反序列化为以下类
case class Target(
a: Option[Long],
b: String
)
使用以下代码:
val mapper = new ObjectMapper()
.registerModule(DefaultScalaModule)
val req =
"""{
| "a": 123,
| "b": "xyz"
|}
""".stripMargin
val res = mapper.readValue(req, classOf[Target])
但由于 jackson 中的错误(如常见问题解答中所述),
以下代码将失败:
println(res.a.map(_ + 1))
有错误:
java.lang.Integer 不能转换为 java.lang.Long
创建以下 mixin 解决了该错误,并且代码按预期工作:
class Mixin(
@JsonDeserialize(contentAs = classOf[Long]) a: Option[Long],
b: String
)
val mapper = new ObjectMapper()
.registerModule(DefaultScalaModule)
.addMixIn(classOf[Target], classOf[Mixin])
val res = mapper.readValue(req, classOf[Target])
println(res.a.map(_ + 1))
问题
在我的案例Target
中,类包含很多字段,其中只有一个需要注释。
因此,我想Mixin
只用一个参数来创建:
class Mixin(
@JsonDeserialize(contentAs = classOf[Long]) a: Option[Long]
)
但是当Mixin
这样定义时,注释似乎没有应用,并且这段代码再次失败:
println(res.a.map(_ + 1))
有没有办法让它工作?
重现问题的完整代码:
case class Target(
a: Option[Long],
b: String
)
class Mixin(
@JsonDeserialize(contentAs = classOf[Long]) a: Option[Long]
// , b: String //<--- uncommenting this line will fix the code
)
val mapper = new ObjectMapper()
.registerModule(DefaultScalaModule)
.addMixIn(classOf[Target], classOf[Mixin])
val req =
"""{
| "a": 123,
| "b": "xyz"
|}
""".stripMargin
val res = mapper.readValue(req, classOf[Target])
println(res.a.map(_ + 1))