[英]Play json parse missing field as empty array
使用play-json 2.3我该如何解析
{i: 0}
进入这个
case class A(i: Int, s: Seq[Int])
我非常想重用Json.format宏
此刻它给我“缺少路径s”
UPD:我最终写了一个自定义格式并将其拉皮到JsPath上:
implicit class JsPathExtensions(path: JsPath) {
//return mzero if the path is missing
def lazyFormatNullableM[T: Monoid](f: => Format[T]): OFormat[T] = OFormat(path.lazyReadNullable(f).map(_.orZero), new OWrites[T] {
override def writes(o: T) = path.lazyWriteNullable(f).writes(o.some)
})
}
如果缺少路径,则在不更改类的情况下我看不到任何利用宏的方法。 在这种情况下,您可以使用json组合器定义Reads
并将宏用于Writes
。
import play.api.libs.json._
import play.api.libs.functional.syntax._
implicit val reads: Reads[A] = (
(__ \ "i").read[Int] and
(__ \ "s").read[Seq[Int]].orElse(Reads.pure(Nil))
)(A.apply _)
implicit val writes: Writes[A] = Json.writes[A]
json宏仅涵盖了非常有限的用例范围,不可避免地会遇到必须编写自己的Reads
或Writes
。
利用Json.format[A]
宏的最简单方法是稍微更改A
的定义:
case class A(i: Int, s: Option[Seq[Int]])
Option
的用法非常清楚,您可以在其上map
并做很多好事,但是如果您真的想将s
视为一个空集合,则可以进一步增强case类:
case class Foo(i: Int, s: Option[Seq[Int]]) {
lazy val theSeq:Seq[Int] = s.getOrElse(Seq[Int]())
}
现在,如果您访问theSeq
,则省略s
传入JSON和为s
提供空数组的JSON绝对没有区别。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.