25

Scala 2.10 では、リフレクションが改善されているようです。

これは、lift-json、jerkson、sjson などにどのような影響を与えますか? さらに、それほど遠くない将来、Groovy の優れた Scala の GSON に似たビルトイン JSON 言語機能を期待できますか?

私が尋ねる理由は、私が心からやりたいと思っているからです:

case class Foo(a: String, b: Int, bar: Bar)
case class Bar(c: Int)
val foo = Foo("hey", 10, Bar(23))
val json = foo.toJson

任意の複雑なオブジェクト グラフであっても、フープ ジャンピング (定型的な準備作業) は必要ありません。言い過ぎかもしれませんが、人はいつでも夢を見ることができます。私の 2.10 の夢を打ち砕くか、待望の Scala のリリースでどのような新しい道が開かれるか教えてください。

また、ケースクラスに関しては、バリデーション/作成のようで、scalaz バリデーションが最適な武器です。オブジェクト作成の安全なプロキシとして、またはエラー コレクターとして機能することは、非常に素晴らしいことのように思えます。しかし、Scewbie として、私は scalaz がいくぶんやりがいを感じており、F-ing のダークサイドに抵抗しています ;-)

いずれにせよ、ここでのポイントは、2.10 リフレクションを使用すると、たとえばフォーム ポストからケース クラスのプロパティにフィールドを実行時にバインドし、プロパティ タイプのみに基づいて基本的な検証を実行できるはずです (つまり、プロパティ foo を指定する別の検証ロジックを指定するには、その型が適切に反映できるようになったケース クラスで既に定義されているため、文字列でなければなりません)

では、勇敢な新世界が到来するのか、それとも既存のツールが予見可能な将来の主力なのか?

4

3 に答える 3

6

序文

Java ベースのライブラリに依存せず、純粋な Scala ライブラリのみに依存する別のソリューションを紹介しましょう。

実際、@Steve の結果のコメントで説明されているように、Play 2 の scala バージョンでは、Jerkson をドメイン モデルへの逆シリアル化に使用していました。Jerkson は、Json を処理するための非常に優れた Java ライブラリの DSL ラッパーです。

答え

Scala 2.10のリフレクションとマクロ機能を使用してこのタスクを容易にすることが想定されているかどうかを尋ねていたので、上記はあなたの質問に答えていません!!!! ほとんどのボイラープレートを排除することによって。

Play 2.1 バージョンから、Json Scala API は Jerkson を使用しなくなり、独自のメカニズムになったため、実際には非常に良い考えでした。

実際、このメカニズムは、次の 2 つのことに基づいたまったく新しい API を導入することで、この新しい 2.10 バージョンの Scala を利用しています。

  • Json または Domain インスタンスを読み書きできるように適合された機能的構造 (Applicative Builder)。これらのビルダーは、大まかな構造化を定義するために (パーサー コンビネーターで行うように) コンビネーター (読み取りまたは書き込みの両方) を完全に接着するために使用されます。
  • どのコンビネータが暗黙的に利用可能で、Case クラス(または少なくともメソッドapplyunapplyメソッドを持つ型) の複雑なコンビネータを構築するかを発見できる一連のマクロ。

結局のところ、この API を使用してできることは次のとおりです。

import play.api.libs.json._
import play.api.libs.functional.syntax._

case class Person(name: String, age: Int, lovesChocolate: Boolean)

implicit val personReads = Json.format[Person] //a format is a Reader and a Writer

//this format will be implicitly used by the following from/toJson functions
val person:JsResult[Person] = Json.fromJson(json) //JsResult is like JsSucces/JsError
val jsObject = Json.toJson(person)

コードのコピー元: JSON Inception (Scala 2.10 マクロに基づく)

ちょっとした注意: 新しい API は、エラーを蓄積して「読み取り」を検証できるほどスマートです...

参考文献

@mandubian からの一連のブログがあります。これらは非常に啓発的であるため、ここからお勧めします。

最後の注意事項

悲しいことに、Play 2 のモジュール化により、この API を単独で使用することができなくなりました! したがって、全体として play lib から使用する必要があります :/ これは将来変更される可能性があります...

編集

Pascal にはこのリポジトリがあり、play-json API を使用できるようになっているため、未来は近づいています。

したがって、Play 2.2 がリリースされるまで、このリポジトリを使用できます。実際、このバージョンは json や iteratees などのいくつかの API と完全に分離されるため、playframework リポジトリを直接使用できるようになります。

于 2013-01-02T21:48:41.077 に答える
4

Jerksonは、今日のユースケースを処理します。

Json.generate(foo)

また、本番環境で広く使用されているストリーミングの読み取りと書き込みもサポートしています。

Json.generate(foo, outputStream)
Json.parse[Foo](inputStream)

もともとはlift-jsonを使用していましたが、ケースクラスのストリーミングサポートがないため、大きなjsonドキュメントの読み取りと書き込みには使用できませんでした。Jerksonも超高速で、ネストされたケースクラスを完全に処理します。

于 2012-03-18T14:15:53.830 に答える