Play/Scala如何防止Json序列化空数组?

 梦天使悠然 发布于 2023-01-31 20:48

我想以递归方式将一个类写入Json,因此我使用以下隐式写入:

implicit val writesObject : Writes[Object] = (
  (__ \ "id").writeNullable[String] ~
  (__ \ "list").lazyWriteNullable(Writes.traversableWrites[Object](writesObject))
)(unlift(Object.unapply)

其中Object是这样的类:

case class Object(id: Option[String], list: Option[Seq[Object]])

它有效,但是如果"list"为空,我想阻止它打印任何东西.例如:

我想要:

{ id: "someID",
  list: [
          {
            id: "someOtherId"            
          }
        ] 
}

我目前得到(但不想要):

{ id: "someID",
  list: [
          {
            id: "someOtherId"            
            list: []
          }
        ] 
}

我怎样才能做到这一点?我是Play/Scala的新手,不确定我应该注意什么,所以任何指针都会有所帮助.我正在使用Scala 2.2.1.

PS:我已经检查过Scala Json Combinators,但没有看到任何关于如何完成这项工作的参考.

更新:

所以我的问题不是该列表为空,但该列表为空.这就是为什么lazyWriteNullable不起作用的原因.

测试johanandren的答案我想出了JsPath的以下扩展,返回Option [T]并支持递归写入的惰性格式:

def lazyWriteNullableIterable[T <: Iterable[_]](w: => Writes[T]): OWrites[Option[T]] = OWrites((t: Option[T]) => {
  if(t != null) {
    t.getOrElse(Seq.empty).size match {
      case 0 => Json.obj()
      case _ => Writes.nullable[T](path)(w).writes(t)
    }
  }
  else {
    Json.obj()
  }
})

谢谢

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有