我正在使用新的Play 2.1-RC1框架,我有一个具有Option []字段的类,如下所示:
import play.api.libs.json._
import play.api.libs.json.util._
import play.api.libs.json.Reads._
import play.api.libs.json.Writes._
import play.api.libs.json.Format._
import play.api.libs.functional.syntax._
case class Test(name: String, value: Option[String])
object Test {
implicit val testFormat = (
(__ \ "name").format[String] and
(__ \ "value").format[Option[String]]
)(Test.apply, unlift(Test.unapply))
def fromJson(js: String): Test = {
Json.fromJson[Test](Json.parse(js)).fold(
valid = { t => t},
invalid = { e => {
val missingField = (e(0)._1).toString.substring(1)
val badJs = js.trim
val newJs = badJs.substring(0, badJs.length()-1)+",\""+missingField+"\":null}"
fromJson(newJs)
}}
)
}
}
我希望能够处理省略可选“值”数据的JSON字符串,例如
val y = """{"name":"someone"}"""
(编辑问题) 我可以重写json字符串(相当笨拙),如验证步骤所示,但是 是否有一个更简单的模式,我可以用来为缺少的可选字段提供无?请注意,此重写不适用于嵌套结构,也不适用于我无法简单地附加缺少字段的任何位置。
答案 0 :(得分:6)
你可以这样做:
import play.api.libs.json._
import play.api.libs.functional.syntax._
case class Test(name: String, value: Option[String])
implicit val testFormat = Json.format[Test]
def hoge = Action(Json.parse.json) { request =>
Json.fromJson[Test](request.body)
...
}
答案 1 :(得分:4)
好的......所以答案非常简单。使用
fomatOpt()
表示可选字段。所以测试格式化器现在看起来像这样:
import play.api.libs.json._
import play.api.libs.json.util._
import play.api.libs.json.Reads._
import play.api.libs.json.Writes._
import play.api.libs.json.Format._
import play.api.libs.functional.syntax._
case class Test(name: String, value: Option[String])
object Test {
implicit val testFormat = (
(__ \ "name").format[String] and
(__ \ "value").formatOpt[String]
)(Test.apply, unlift(Test.unapply))
def fromJson(js: String): Test = {
Json.fromJson[Test](Json.parse(js)).fold(
valid = { t => t},
invalid = { e => {
println("BAD JSON!")
null
}}
)
}
}