播放斯卡拉杰森失踪物业vs Null

Jam*_*hen 5 scala playframework playframework-2.0 playframework-2.1

我有一个用例,我需要接受空值,但不是缺少属性.这是在Play Framework 2.1.3上

例如:

case class Foo(a: Option[String], b: Option[String], c: Option[String])
Run Code Online (Sandbox Code Playgroud)

此案例类可以是更大案例类的一部分

我想接受以下内容并生成foo对象:

{
   "foo" : {
        "a" : "blah",
        "b" : null,
        "c" : "blah"
    }
}
Run Code Online (Sandbox Code Playgroud)

但不是这个:

{
   "foo" : {
        "a" : "blah",
        "c" : "blah"
    }
}
Run Code Online (Sandbox Code Playgroud)

目前我有以下内容将JSON读入案例类:

val FooReader = (
    (__ \ "a").readNullable[Setting] and
    (__ \ "b").readNullable[String] and
    (__ \ "c").readNullable[String])(Foo)
Run Code Online (Sandbox Code Playgroud)

如何使FooReader在缺少的属性上生成JsError但允许null?

tre*_*nik 5

您可以使用以下内容:

val FooReader = (
  (__ \ "a").readNullable[String] and
  (__ \ "b").read(Reads.optionNoError[String]) and
  (__ \ "c").readNullable[String]
)(Foo)
Run Code Online (Sandbox Code Playgroud)

如果缺少'(__ \"b")','Reads.optionNoError [String]'将产生JsError.

你实际上可以这样做:

val FooReader = (
  (__ \ "a").read(Reads.optionNoError[String]) and
  (__ \ "b").read(Reads.optionNoError[String]) and
  (__ \ "c").read(Reads.optionNoError[String])
)(Foo)
Run Code Online (Sandbox Code Playgroud)