Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将json解析缺少的字段作为空数组播放_Json_Scala_Playframework - Fatal编程技术网

将json解析缺少的字段作为空数组播放

将json解析缺少的字段作为空数组播放,json,scala,playframework,Json,Scala,Playframework,使用play json 2.3 我如何解析这个 {i: 0} 进入这个 case class A(i: Int, s: Seq[Int]) 我非常希望重用Json.format宏 现在它给了我“迷路s” UPD: 我最终编写了一个自定义格式并将其pimping到JsPath上: implicit class JsPathExtensions(path: JsPath) { //return mzero if the path is missing def lazyFormatNull

使用play json 2.3 我如何解析这个

{i: 0}
进入这个

case class A(i: Int, s: Seq[Int])
我非常希望重用Json.format宏

现在它给了我“迷路s”

UPD: 我最终编写了一个自定义格式并将其pimping到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.format[A]
宏的最简单方法是稍微更改
A
的定义:

case class A(i: Int, s: Option[Seq[Int]])
这里
选项的用法非常清楚,您可以
映射到它上面,做很多好事,但是如果您真的想把
s
当作一个空集合来对待,您可以进一步增强您的案例类:

case class Foo(i: Int, s: Option[Seq[Int]]) {
  lazy val theSeq:Seq[Int] = s.getOrElse(Seq[Int]())
}

现在,如果您访问seq
,忽略
s
的传入JSON和为
s
提供空数组的JSON之间绝对没有区别。如果缺少路径,我看不到在不更改类的情况下使用宏的任何方法。在这种情况下,您可以使用json组合符定义
读取
,并将宏用于
写入

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宏只涵盖非常有限的用例范围,并且不可避免地会遇到这样的情况:您必须编写自己的
读取
写入

是的,我考虑过这一点,但更改类不是选项相同的问题,您是否找到了强制Play.json初始化empty seq而不是抛出错误的方法?
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]