は、私は以下のクラスを持っていると言うことができますクラス名を追加しますGsonですべてのクラスのclassNameを自動的に追加したいので、次の結果が得られます。Gsonは自動的
{
"madDog" : {
"name":"Edvard",
"className":"Dog"
},
"className" : "Animal"
}
誰かが、これが何らかの種類のインターセプタやGsonのもので可能かどうかを知っていますか?
は、私は以下のクラスを持っていると言うことができますクラス名を追加しますGsonですべてのクラスのclassNameを自動的に追加したいので、次の結果が得られます。Gsonは自動的
{
"madDog" : {
"name":"Edvard",
"className":"Dog"
},
"className" : "Animal"
}
誰かが、これが何らかの種類のインターセプタやGsonのもので可能かどうかを知っていますか?
これにはカスタムシリアライザが必要です。ここでは上記の動物クラスの例です:
public class AnimalSerializer implements JsonSerializer<Animal> {
public JsonElement serialize(Animal animal, Type typeOfSrc, JsonSerializationContext context) {
JsonObject jo = new JsonObject();
jo.addProperty("className", animal.getClass().getName());
// or simply just
jo.addProperty("className", "Animal");
// Loop through the animal object's member variables and add them to the JO accordingly
return jo;
}
}
は、その後、あなたが望むようシリアライザを取り付けるためにGsonBuilderを経由して新しいGson()オブジェクトをインスタンス化する必要があります。
Gson gson = new GsonBuilder()
.registerTypeAdapter(Dog.class, new DogSerializer())
.registerTypeAdapter(Animal.class, new AnimalSerializer())
.create();
RuntimeTypeAdapterFactory<BillingInstrument> rta = RuntimeTypeAdapterFactory.of(
BillingInstrument.class)
.registerSubtype(CreditCard.class);
Gson gson = new GsonBuilder()
.registerTypeAdapterFactory(rta)
.create();
CreditCard original = new CreditCard("Jesse", 234);
assertEquals("{\"type\":\"CreditCard\",\"cvv\":234,\"ownerName\":\"Jesse\"}",
gson.toJson(original, BillingInstrument.class));
これは本当に問題を解決しませんか?私はすべてのフィールドに標準的なシリアライゼーションを使用したいが、クラス名のために1つの追加フィールドを追加する - 本当に普通のユースケースのように感じる。 – mjaggard
問題は、通常のシリアライゼーションに単一のフィールドを追加したいということです。私の解決策では(特に余分な依存関係に頼ることなく)その問題が解決されます。私はそれが一種の痛みだと理解していますが、カスタムシリアライザを作成して登録することなくこの単純な作業を達成する方法ではない/そうではないようです。 –