Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 某些字段上的Jackson注释mixin不';行不通 前言_Json_Scala_Jackson_Jackson Module Scala - Fatal编程技术网

Json 某些字段上的Jackson注释mixin不';行不通 前言

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.

我想将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中的一个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,它支持将从线路接收的字节立即解析为嵌套数据结构,包括以下选项: