【问题标题】:Json4s ignoring None fields during seriallization (instead of using 'null')Json4s 在序列化期间忽略 None 字段(而不是使用'null')
【发布时间】:2015-01-09 07:40:56
【问题描述】:

我有一个使用json4s 的通用 json 序列化方法。不幸的是,如果值为None,它将忽略字段。我的目标是让None 字段用null 值表示。我尝试为 None 添加自定义序列化程序,但仍然无法正常工作。

object test extends App {
          class NoneSerializer extends CustomSerializer[Option[_]](format => (
            {     
              case JNull => None
            },
            {
              case None => JNull

            }))

         implicit val f = DefaultFormats + new NoneSerializer

          case class JsonTest(x: String, y: Option[String], z: Option[Int], a: Option[Double], b: Option[Boolean], c:Option[Date], d: Option[Any])

          val v = JsonTest("test", None, None,None,None,None,None); 
println(Serialization.write(v))
}

以上代码的结果:

{"x":"test"}

我尝试了this link 和其他一些,但没有解决案例类的问题

【问题讨论】:

    标签: json scala json4s


    【解决方案1】:

    我假设您希望在 JSON 中将 Nones 序列化为 null。在这种情况下,使用DefaultFormats.preservingEmptyValues 就足够了:

    import java.util.Date
    import org.json4s._
    import org.json4s.jackson.Serialization
    
    object test extends App {
    
      implicit val f = DefaultFormats.preservingEmptyValues // requires version>=3.2.11
    
      case class JsonTest(x: String, y: Option[String], z: Option[Int], a: Option[Double], b: Option[Boolean], c:Option[Date], d: Option[Any])
    
      val v = JsonTest("test", None, None, None, None, None, None);
    
      // prints {"x":"test","y":null,"z":null,"a":null,"b":null,"c":null,"d":null}
      println(Serialization.write(v))
    }
    

    【讨论】:

    • 你用的是哪个json4s版本?
    • 我使用的是3.2.10版本
    • 非常感谢.. 升级到 3.2.11 后它正在工作 :)
    • 你知道如何只为一个字段获取这个吗?
    • @RhysBradbury 是的,这也是可能的,尽管通过使用FieldSerializer 的不同方法,请参阅stackoverflow.com/a/49759794
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    • 2013-08-17
    • 2014-05-20
    • 1970-01-01
    • 2020-06-09
    • 2010-11-27
    相关资源
    最近更新 更多