如何强制播放框架 2.4.x 序列化具有空列表的字段

Posted

技术标签:

【中文标题】如何强制播放框架 2.4.x 序列化具有空列表的字段【英文标题】:HowTo enforce Play framework 2.4.x to serialize field with empty list 【发布时间】:2016-11-05 20:27:17 【问题描述】:

我正在使用 scala 游戏! 2.4.x 并尝试序列化案例类:

case class MyEvent(
    id: String,
    parentId: Option[ParentRef] = None,
    stepStatus: String = "undefined",
    artifacts:Seq[String] = Seq.empty,
    events:Seq[String] = Seq.empty  
  )

问题在于序列化的 json 不包含字段 artifactsevents,因为它们的默认值是空序列。 Receiver 希望获得字段名称,即使它们是空的。 我必须强制 json 序列化程序添加 "artifacts": [], "events":[]

不手动编写整个格式化程序的正确方法是什么?我有几十个字段。

【问题讨论】:

您可以将artifactsevents 成员设为Option[Seq[String]] 吗? AFAIK 没有其他不涉及手动编写 Reads/Format 的方法。 你的意思是在接收方?不,这是不可能的。 当试图重现这一点时,我似乎发现了 2.3 和 2.4 之间的一些行为差异。还不能解决。在 2.3 中,肯定存在工件和事件,并且有几个 SO 问题是关于试图抑制它们。我知道没有帮助。如果您解决了,请告诉我们。 【参考方案1】:

所以,对于 2.4.x,它是这样工作的:

case class MyEvent(
    id: String,
    parentId: Option[ParentRef] = None,
    stepStatus: String = "undefined",
    artifacts:Seq[String] = Seq(),
    events:Seq[String] = Seq()  
  )

Seq() 强制播放 json 生成 "events": [] 这对我来说很好。我发现 play-json 的东西有点过度设计。 :( 我真的很想念我过去的 Java 中的 google Gson :) 非常简单,而且可以正常工作。

【讨论】:

以上是关于如何强制播放框架 2.4.x 序列化具有空列表的字段的主要内容,如果未能解决你的问题,请参考以下文章

反应原生平面列表如何强制列表项具有相同的高度?

强制 YouTube 播放列表为 HTML5 播放

Qt Multimedia - 如何强制从媒体文件中读取标签

通过ffmpeg直播HLS,如何强制客户端从头开始播放?从第一段

即使用户有一些播放列表,Spotify Web API 也会为用户播放列表返回空项目

Protobuf-Net 总是反序列化一个空列表