2

このようなエンティティがある場合

class Foo
{
   private String Bar = "someBarValue";
}

と次のステートメント

String json = new Gson().toJson(new Foo());

結果は{ "bar" : "someBarValue"}

標準のJava Bean規則に従うクラスがたくさんあります

class FooBean
{
    String getBar() { return "someBarValue"; }
}

と次のステートメント

String json = new Gson().toJson(new FooBean());

結果は{}

FooBeanクラスのプライベート メンバー変数に依存せずに、Gson を使用して上記の例からシリアル化 (セッターがある場合は、最終的に逆シリアル化) するにはどうすればよいですか?

4

1 に答える 1

4

これは今日の時点では不可能です。Gson Design Documentをご覧ください。

フィールドとゲッターを使用して Json 要素を示す

一部の Json ライブラリは、型のゲッターを使用して Json 要素を推測します。一時的、静的、または合成ではないすべてのフィールド (継承階層の上) を使用することを選択しました。これを行ったのは、すべてのクラスが適切な名前のゲッターで記述されているわけではないためです。さらに、getXXX または isXXX は、プロパティを示すのではなく、セマンティックである可能性があります。

ただし、プロパティをサポートするための適切な議論もあります。後のバージョンで Gson を拡張して、Json フィールドを示すための代替マッピングとしてプロパティをサポートする予定です。今のところ、Gson はフィールドベースです。

もう 1 つ考えられるのは、シリアライゼーション/デシリアライゼーションの概念です。なぜオブジェクトをシリアライズ/デシリアライズするのでしょうか? 一般に、永続化、通信 (つまり、主に I/O) の後にそのコピーを保持します。そのためにゲッターとセッターに依存しないことは理にかなっています。それらはオブジェクトの内容を変更する可能性があるため、シリアライゼーション/デシリアライゼーションは、それらが構築された目的を達成できません。

于 2013-03-02T21:40:13.770 に答える