当前位置:  开发笔记 > 编程语言 > 正文

如果缺少可选值,则显式输出JSON null

如何解决《如果缺少可选值,则显式输出JSONnull》经验,为你挑选了1个好方法。

考虑使用Play的JSON API(play.api.libs.json)的示例:

case class FooJson(
   // lots of other fields omitted
   location: Option[LocationJson]
)

object FooJson {
  implicit val writes = Json.writes[FooJson]
}

case class LocationJson(latitude: Double, longitude: Double)

object LocationJson {
  implicit val writes = Json.writes[LocationJson]
}

如果locationNone,则生成的JSON将完全没有location字段。这是很好的并且是不可改变的。但是,如果出于某种原因(例如,使我的API更加自我记录),我该如何显式输出nullJSON

{      
  "location": null
}

我还尝试将字段定义为location: LocationJson并将其传递option.orNull给它,但是它不起作用(scala.MatchError: nullat play.api.libs.json.OWrites$$anon$2.writes)。对于非自定义类型(例如String或Double),此方法在JSON输出中生成null。

所以,虽然使用Json.writes[FooJson]上述如图所示(或其他同样简单,即具有编写自定义Writes实现),有一个干净的方式包括在JSON空?

我要问的是类似于JsonInclude.Include.ALWAYSJackson库中的内容(也是Jackson的默认行为)。同样,在Gson中,这是微不足道的
new GsonBuilder().serializeNulls().create())。

播放2.4.4



1> Jonik..:

Play的提交者Greg Methvin 在一个相关的GitHub问题中向我写了这个答案:

JSON宏仅支持一种编码可选值的方式,即从JSON中省略None值。这不是错误,而是实现的限制。如果要包含null,那么很遗憾,您必须实现自己的null Writes

我确实认为我们应该尝试为宏提供更多的可配置性。

在这种情况下,即使值略微牺牲了API的一致性和可自我记录性,我也会让Play在该值为null时排除该字段。(在这个特定的API中)仍然是一件很小的事情,以至于它不像Writes在具有十几个值的案例类中那样自定义将自定义代码那样丑陋。

我希望他们能在将来的Play版本中使此配置更具可配置性。

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有