私は新しい 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文字列を書き直すことができますが、欠落しているオプションフィールドにNoneを提供するために使用できるより単純なパターンはありますか? この書き直しは、ネストされた構造や、欠落しているフィールドを単純に追加できない場所では機能しないことに注意してください。