Как обрабатывать дополнительные поля в разборе JSON в игре 2.1
Я использую новую структуру 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, которые опускают необязательные данные "value", например.
val y = """{"name":"someone"}"""
(отредактированный вопрос)
Я могу переписать строку json (довольно неуклюже), как показано на шаге проверки, но
есть ли более простой шаблон, который я могу использовать для поставки None для отсутствия дополнительных полей? Обратите внимание, что этот переписать не работает с вложенными структурами или где угодно, где я не могу просто добавить недостающее поле.
Ответы
Ответ 1
Вы можете просто сделать это:
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)
...
}
Ответ 2
ОК... так что ответ очень прост. Используйте
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
}}
)
}
}