5

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

例如:

case class Foo(a: Option[String], b: Option[String], c: Option[String])

这个案例类可能是更大案例类的一部分

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

{
   "foo" : {
        "a" : "blah",
        "b" : null,
        "c" : "blah"
    }
}

但不是这个:

{
   "foo" : {
        "a" : "blah",
        "c" : "blah"
    }
}

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

val FooReader = (
    (__ \ "a").readNullable[Setting] and
    (__ \ "b").readNullable[String] and
    (__ \ "c").readNullable[String])(Foo)

如何让 FooReader 在缺少的属性上生成 JsError 但允许为空?

4

1 回答 1

5

你可以使用类似的东西:

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

如果 '(__ \ "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)
于 2013-08-22T20:10:10.433 回答