カスタム コンストラクターを作成する場合、Gson で使用する引数なしで作成する必要がありますか?
4 に答える
実際、そのような要件がある場合は、Gensonライブラリを試すことができます。引数付きのコンストラクターを使用してオブジェクトを逆シリアル化できます。要件は、パラメーターの名前が json の名前と一致する必要があることです。次に例を示します。
public static class MyClass {
public final String someString;
public MyClass(String someString) {
this.someString = someString;
}
}
String json = "{\"someString\": \"foo bar\"}";
// enable this feature
Genson genson = new Genson.Builder().setWithDebugInfoPropertyNameResolver().create();
MyClass mc = genson.deserialize(json, MyClass.class);
編集:その場合、GensonにはGsonよりもいくつかの利点があると思います。
カスタム デシリアライザーを作成するのは面倒で、引数なしのコンストラクターを提供しないクラスごとに別のデシリアライザーを作成する必要があります。多すぎると思います…
InstanceCreator を書く方が簡単ですが、それが正しい方法だとは思いません。実際、クラスごとに InstanceCreator を記述する必要があります。最大の欠点は、逆シリアル化される値がないことです。したがって、null と定数を引数として渡すことを除いて、多くのことはできません...
引数付きのコンストラクターの処理は、Gensons の強みの 1 つだと思います。追加のコードは必要ありません。json ストリームからの値を引数として効果的に渡します。別のプロパティ名を使用する場合は、 @JsonProperty("newName") でパラメーターに注釈を付けることができます。他のプロパティは、セッターとフィールドを使用して設定されます (Gson はフィールドのみを使用します)。必要に応じて、ctrs の代わりに静的ファクトリ メソッドを提供することもできます。例えば :
public class MyClass {
private String myString;
@JsonCreator public static MyClass create(String myString) {
return new MyClass(myString);
}
}
オプション1:はい。独自のコンストラクターを作成しない限りJsonDeserializer
、JsonSerializer
その場合、シリアライザーは任意のコンストラクターを使用できます。
具体的には、クラスに不変であるなどの他の要件がある場合、または初期化後の最小状態を保証したい場合は、余分な作業を行うことをお勧めします。
PS:実際、私JsonDeserializer
はそれで十分だと思います。インサイトは誰ですか?
オプション2:(ユーゲンの回答を参照)代わりにGensonの使用を検討してください
オプション3: (Robertianoの回答を参照)デフォルトのデシリアライザーを保持し、代わりにInstanceCreatorを実装します
GSON デシリアライザーを節約し、空のコンストラクターを使用せずにオブジェクトのインスタンスを作成するだけでよい場合は、これInstanceCreator
が最適なソリューションです。
はい。ただし、引数のないコンストラクターはプライベートにすることができます。したがって、引数を持つパブリック コンストラクター (不変クラス) と、逆シリアル化のためだけに引数なしのプライベートコンストラクターを 1 つ持つことができます。
これはあまり洗練されたソリューションではありませんが、少なくとも追加のコンポーネントを作成する必要はありません。