1

json を正しくデシリアライズする方法について、play フレームワークを使用するときに混乱しているようです。jerkson を使用すると、json 文字列を自動的に逆シリアル化するケース クラスを定義する必要があるように見えます (jerkson のドキュメントから盗みました)。

case class Person(id: Long, name: String)
parse[Person]("""{"id":1,"name":"Coda"}""") //=> Person(1,"Coda")

しかし、play フレームワークでは、同じことを行うために多くの定型コードを書かなければなりません。たとえば、彼らのドキュメントから。

case class Foo(name: String, entry: Int) 

object Foo {
  implicit object FopReads extends Format[Foo] {
    def reads(json: JsValue) = Foo(
      (json \ "name").as[String],
      (json \ "entry").as[Int])
    def writes(ts: Foo) = JsObject(Seq(
      "name" -> JsString(ts.name),
      "entry" -> JsNumber(ts.entry)))
    }
 }

これはより多くの作業のように思えるので、正しく使用していないか、この方法で行う利点をよく理解していないと思います。このコードをすべて書かなくても済むようにするショートカットはありますか? そうでない場合、アクションで jerkson を使用して着信 json 文字列を解析する必要がありますか? asJsonが正常に機能している場合でも、asTextが空の文字列を返しているようです...これは、私が間違いなく何か間違ったことをしていると信じさせます。

ありがとう

4

2 に答える 2

1

あなたの質問には2つの答えがあると思います。

  1. ボイラープレートをいくらか少なくするには、ケースクラスを処理するための Play サポートを使用できます。3 つのフィールドを持つケース クラスの例を次に示します。

    暗黙的な val SampleSetFormat: Format[SampleSet] = productFormat3("sensorId", "times", "values")(SampleSet)(SampleSet.unapply)

  2. もっと厄介なボイラー プレートがあることに同意します。これは、Play の人々がこのアプローチを使用しているように見える主な理由であり、コンパイル時に完全に正しいシリアライザーを決定できるようにします。したがって、ジャークソンのように反映するコストはありません。

于 2012-07-29T18:41:06.110 に答える
0

私は Play と Jerkson の完全な初心者ですが、定型的なアプローチを最小限にすることを心からお勧めします (各アクション内で Jerkson lib を使用します)。そうすることは哲学的にScalaとより一致しており、うまく機能することがわかりました。

于 2012-12-29T00:17:43.423 に答える