13

Play with Scala のこれらの Json シリアライザーは、私を夢中にさせています。

何十もの投稿、チュートリアル、ドキュメントを読みました。読み取り/書き込み/フォーマットのオーバーライドを実装する4つの異なる方法を試しましたが、すべて役に立ちませんでした。

そこで、カスタム タイプをやめて、非常にシンプルにすることにしました。

  def suggest = Action(parse.json) {
    request =>
      request.body.validate[(String, String)].map {
        case (suggestion, categories) => Ok("You suggested " + suggestion + " for categories " + categories)
      }.recoverTotal {
        e => BadRequest(JsError.toFlatJson(e))
      }
  }

そして、件名に記載されているようにエラーが返されます。

このような基本的な本体にカスタムの読み取り/書き込み/フォーマットの実装を提供する必要は本当にありますか?

サンプルの入力本文は次のようになります。

{"suggestion":"add generics", "categories":"request;language;updates"}

私が見逃している簡単なことは何ですか?

4

2 に答える 2

6

遊ぶ!Json を操作する多くの方法を提供します。コードの外観から、Tuple の道を進んでいます。これにより、本質的に Json をタプルに変換できます。また、正確なエラー報告が得られないという欠点がある「読み取り」も使用しています(つまり、無効な json が渡された場合、無効であることがわかります...しかし、なぜ無効であったかは必ずしもわかりません)。さらにエラー処理が必要な場合は、「検証」メソッドの使用を開始する必要があります (詳細はこちら: http://www.playframework.com/documentation/2.1.1/ScalaJsonCombinators )。

別の方法として、Json をケース クラスにマップして、次のようにすることもできます。

import play.api.libs.json._

case class MyClass(
  suggestion: String,
  categories: String
)

object MyClass {
  implicit val readsMyClass: Reads[MyClass] = new Reads[MyClass] {
    def reads(json: JsValue): JsResult[MyClass] = {
      for {
        suggestion <- (json \ "suggestion").validate[String]
        categories <- (json \ "categories").validate[String]
      } yield MyClass(json,categories)
    }
  }
}

これは多くのコードのように見えるので、Play 2.1 ではまだ試していない Json 'Inception' が導入されました ( http://www.playframework.com/documentation/2.1.1/ScalaJsonInception )。

最後に、Json 検証が必要であるが、ケース クラスをマーシャリング/アンマーシャリングする必要がない場合は、「coast-to-coast」メソッドを試すことができます。これにより、すべての json が JsObject 型として保持されますが、それでも検証が行われます。ここのサンプルコード: https://github.com/mandubian/play2-json-demo/blob/master/json-coast-to-coast/app/controllers/Application.scala

お役に立てれば。

于 2013-04-27T03:19:38.740 に答える
2

だから私はこれを追加しました:

  implicit val rds = (
    (__ \ 'suggestion).read[String] and
    (__ \ 'categories).read[String]
  ) tupled

そして、それはうまくいくようです。

しかし、これが本当に最善の方法なのだろうか? シリアル化/逆シリアル化するタイプが多数ある場合、大量のコードのように思えます。

于 2013-04-24T05:22:23.460 に答える