Json 某些字段上的Jackson注释mixin不';行不通 前言
我想将json反序列化到以下类Json 某些字段上的Jackson注释mixin不';行不通 前言,json,scala,jackson,jackson-module-scala,Json,Scala,Jackson,Jackson Module Scala,我想将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.
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中的一个bug(如中所述),以下代码将失败:
println(res.a.map(_ + 1))
有误:
无法将java.lang.Integer转换为java.lang.Long
创建以下mixin解决了该bug,代码按预期工作:
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))
案例类目标(
答:选项[Long],
b:字符串
)
类混合(
@JsonDeserialize(contentAs=classOf[Long])a:Option[Long]
//,b:String/问题可能是mixin实际上并没有声明任何字段专用的构造函数,并且构造函数被case类重写。
因此,您可以使用带注释的getter将Mixin建模为trait:
case class Target(
a: Option[Long],
b: String
)
trait Mixin {
@JsonDeserialize(contentAs = classOf[Long]) def a: Option[Long]
}
请尝试使用jsoniter scala,它支持将从线路接收的字节立即解析为嵌套数据结构,包括以下选项: