我想以递归方式将一个类写入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() } })
谢谢