1

JavaでJSONとの間でオブジェクトをシリアライズおよびデシリアライズする方法を比較しているだけです。

ObjectMapper mapper = new ObjectMapper();
String jsonInString = "{'name' : 'john smith'}";

User user = mapper.readValue(jsonInString, User.class);

Playframework と Scala を使用して、これらの読み取りおよび書き込みマッパーを作成する必要があり、非常に冗長です。(参照: https://www.playframework.com/documentation/2.5.x/ScalaJsonHttp )

Java w/Jackson のように「動作」できないのはなぜですか?

私は自分のモデルを持っています。JSON を読み書きしたいだけです。Java では、定型コードを書く必要はありません。

4

1 に答える 1

8

https://www.playframework.com/documentation/2.5.x/ScalaJsonInceptionから

通常、Jackson や Gson などの Java JSON フレームワークは、何も記述せずに背後でそれを行うため、 Reads[TheirClass] を記述するのはクールではないと考える一部の人々から、いくつかの苦情がありました。Play2.1 JSON シリアライザー/デシリアライザーは次のとおりであると主張しました。

  • 完全にタイプセーフで、
  • 完全にコンパイルされた、
  • 実行時にイントロスペクション/リフレクションを使用して何も実行されませんでした。

ObjectMapperジャクソンでは、これらのどれでもありません。リフレクションに大きく依存しているため、難読化ツールを介してクラス ファイルをフィードすると、完全に壊れる可能性があります。そうしない場合でも、コンパイル時に、逆シリアル化しようとしているクラスが実際に逆シリアル化可能であるという保証はありません。

Scala の魅力の 1 つは、非常に強力なコンパイル時の保証を提供することです。暗黙の要素 (例: や のような型クラスReads)Writesは考慮されますが、ボイラープレート/オーバーヘッドが伴います。

Play 開発者はあなたの苦情を聞いていますが、それがなくなる可能性はほとんどありませReadsWrites。代わりに、次のようなコードを見つけるマクロを提供することで、少し冗長にしようとしています。

implicit val personReads = Json.reads[Person]

Personコンストラクターに基づいて、次のように解釈します。

implicit val personReads = (
  (__ \ 'name).read[String] and
  (__ \ 'age).read[Int] and
  (__ \ 'lovesChocolate).read[Boolean]
)(Person)
于 2015-11-09T20:55:27.190 に答える