11

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

4

2 に答える 2

7

これを簡単に行うことができます:

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)
    ...
}
于 2013-01-08T04:07:53.153 に答える
5

OK ... 答えはとても簡単です。使用する

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
      }} 
    )
  }
}
于 2013-01-08T21:21:29.157 に答える