アンドロイドのモシvsグソン[クローズ]


81

私が使用するかどうかを決定してい四角形でモシをシリアル化し、デシリアライズモデルデータやGson。

Gsonについて私がいつも気に入らなかったことの1つは、Androidでは遅くなる可能性のある反射を使用していると思いますか?モシも反射を使っていますか?

モシ対グソンの長所と短所は何ですか?

私はそれらを似ていると思います。たとえば、次のステートメントを作成します。typeAdapter:

class CardAdapter {
  @ToJson String toJson(Card card) {
    return card.rank + card.suit.name().substring(0, 1);
  }

  @FromJson Card fromJson(String card) {
    if (card.length() != 2) throw new JsonDataException("Unknown card: " + card);

    char rank = card.charAt(0);
    switch (card.charAt(1)) {
      case 'C': return new Card(rank, Suit.CLUBS);
      case 'D': return new Card(rank, Suit.DIAMONDS);
      case 'H': return new Card(rank, Suit.HEARTS);
      case 'S': return new Card(rank, Suit.SPADES);
      default: throw new JsonDataException("unknown suit: " + card);
    }
  }
}

それを使用するには、gsonの場合と同じように登録します。

Moshi moshi = new Moshi.Builder()
.add(new CardAdapter())
.build();

typeAdapterで使用されているアノテーションが利点になると思います。Moshiに切り替えると、パフォーマンスが向上するかどうかを調べています。

回答:


94

MoshiはOkioを使用して、Gsonが行っていないいくつかのことを最適化します。

  • フィールド名を読み取る場合、Moshiは文字列を割り当てたりハッシュルックアップを実行したりする必要はありません。
  • Moshiは、入力をUTF-8バイトのシーケンスとしてスキャンし、Java文字に遅延変換します。たとえば、整数リテラルを文字に変換する必要はありません。

これらの最適化の利点は、すでにOkioストリームを使用している場合に特に顕著です。ユーザー改修OkHttpモシから特定の利益インチ

Moshiの起源に関する詳細な議論は、私の投稿であるMoshi、別のJSONプロセッサーにあります。


リフレクションを使用していますか
j2emanue 2017

2
@ j2emanue実装の詳細として、カスタムクラスのデフォルトのJsonAdaptersは、リフレクション付きのフィールドを設定します。
Eric Cochran

1
j2emanueリフレクション@コード生成を使用することによって回避することができるgithub.com/square/moshi#codegen
ペドロ・ロペス

35

redditに関するswankjesseのコメントによると:

私はGsonでの自分の仕事に誇りを持っていますが、その制限のいくつかにも失望しています。私はこれらに対処したかったのですが、「Gson 3.0」としてではなく、一部にはGoogleで働いていないためです。ジェイク、スコット、エリック、そして私は、Gsonのさまざまな制限に対処するためにMoshiを作成しました。GsonよりもMoshiを好む10の小さな理由は次のとおりです。

  1. 今後のKotlinサポート。

  2. @HexColor intのような修飾子は、単一のJavaタイプに対して複数のJSON表現を許可します。

  3. @ToJsonと@FromJsonを使用すると、カスタムJSONアダプターの作成とテストが簡単になります。

  4. JsonAdapter.failOnUnknown()を使用すると、予期しないJSONデータを拒否できます。

  5. 予測可能な例外。Moshiは、IOの問題に対してIOExceptionをスローし、型の不一致に対してJsonDataExceptionをスローします。Gsonはいたるところにあります。

  6. JsonReader.selectName()は、一般的なケースでの不要なUTF-8デコードと文字列割り当てを回避します。

  7. 小さいAPKを発送します。Gsonは227KiB、Moshi + Okioは合わせて200KiBです。

  8. Moshiは、プラットフォームタイプの実装の詳細をエンコードされたJSONにリークしません。これは私にGsonを恐れさせます:gson.toJson(SimpleTimeZone.getTimeZone( "GMT"))

  9. Moshiは、デフォルトでは奇妙なHTMLエスケープを行いません。例として、Gsonのデフォルトのエンコーディングである「12&5 = 4」を見てください。

  10. 壊れた日付アダプタはデフォルトでインストールされていません。

新しいコードを書く場合は、Moshiから始めることを強くお勧めします。Gsonを使用した既存のプロジェクトがある場合、それが単純でリスクがない場合はアップグレードする必要があります。それ以外の場合はGsonに固執してください!互換性と信頼性を維持できるように最善を尽くしています。


1

前のリンクから、moshi codegenを使用すると、モデルクラスへのコンパイル時アダプターが作成され、実行時のリフレクションの使用が削除されることがわかります。

モデル

@JsonClass(generateAdapter = true) 
class MyModel(val blah: Blah, val blah2: Blah)

app / build.gradle

kapt "com.squareup.moshi:moshi-kotlin-codegen:$version_moshi"

モデルプロパティのnull可能性を保証するための検証を含むMyModelJsonAdapterクラスを生成します。


モシの方が速いと思いませんか?
j2emanue
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.