我想将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)的错误(如FAQ中所述),
以下代码将失败:
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))
答案 0 :(得分:1)
问题可能是您的mixin实际上未声明任何字段-仅声明了构造函数。并且构造函数被您的case类覆盖。 因此,您可以做的是使用带注释的吸气剂将Mixin建模为特征:
case class Target(
a: Option[Long],
b: String
)
trait Mixin {
@JsonDeserialize(contentAs = classOf[Long]) def a: Option[Long]
}