Jackson DataBind 的 JSON 序列化将 Some(99):Option [Int]作为{"empty": true,"defined": false}写入。

时间:2021-08-12 04:12:59

标签: json scala jackson deserialization jackson-databind

我正在使用 Jackson 来编写 Scala/Spark 程序,并将问题简化为以下示例。我的问题是当我的 case class 具有 Option[Int]字段(age)设置为 None 时,我看到合理的反序列化输出(即:带有 empty=true 的结构体)。然而,当 age 被定义,即将其设置为某个 Int 值,如 Some (99),我从未在反序列化输出中看到整数值。

给定:

import com.fasterxml.jackson.databind.ObjectMapper
import java.io.ByteArrayOutputStream
import scala.beans.BeanProperty

case class Dog(@BeanProperty name: String, @BeanProperty age: Option[Integer])

object OtherTest extends App {
  jsonOut(Dog("rex", None))
  jsonOut(Dog("mex", Some(99)))

  private def jsonOut(dog: Dog) = {
    val mapper = new ObjectMapper()
    val stream = new ByteArrayOutputStream()

    mapper.writeValue(stream, dog);
    System.out.println("result:" + stream.toString());
  }
}

我的输出如下所示。任何提示 / 帮助都非常感谢!

result:{"name":"rex","age":{"empty":true,"defined":false}}
result:{"name":"mex","age":{"empty":false,"defined":true}}

** 在有用答案后的更新 **

以下是对我来说起作用的依赖项:

implementation 'org.scala-lang:scala-library:2.12.2'

implementation  "org.apache.spark:spark-sql_2.12:3.1.2"
implementation "org.apache.spark:spark-sql-kafka-0-10_2.12:3.1.2"
implementation "org.apache.spark:spark-avro_2.12:3.1.2"
implementation 'com.fasterxml.jackson.module:jackson-module-scala_2.12:2.10.0'

以下是更新后的代码(带有频繁乘客奖励 - 往返例):

  private def jsonOut(dog: Dog) = {
    val mapper = new ObjectMapper()
    mapper.registerModule(DefaultScalaModule)
    val stream = new ByteArrayOutputStream();
    mapper.writeValue(stream, dog);
    val serialized = stream.toString()
    System.out.println("result:" + serialized);
    // 验证我们可以将序列化的东西读回到 case class:
    val recovered = mapper.readValue(serialized, classOf[Dog])
    System.out.println("这里是我们读回来的:" + recovered);
  }

以下是结果输出(现在如预期)->

> Task :OtherTest.main()
result:{"name":"rex","age":null}
这里是我们读回来的:Dog(rex,None)
result:{"name":"mex","age":99}
这里是我们读回来的:Dog(mex,Some(99))

0 个答案:

没有答案