13

次のクラスがあるとしましょう。

public class Dog {
    public String name = "Edvard";
}

public class Animal {
    public Dog madDog = new Dog();
}

これを Gson 経由で実行すると、次のようにシリアル化されます。

GSon gson = new GSon();
String json = gson.toJson(new Animal())

result:
{
   "madDog" : {
       "name":"Edvard"
   }
}

ここまではうまくいきましたが、すべてのクラスの className を Gson で自動的に追加したかったので、次の結果が得られました。

{
   "madDog" : {
       "name":"Edvard",
       "className":"Dog"
   },
   "className" : "Animal"
}

これがある種のインターセプターまたはGsonで可能かどうかは誰にもわかりませんか?

4

2 に答える 2

16

これを見てください: http://code.google.com/p/google-gson/source/browse/trunk/extras/src/main/java/com/google/gson/typeadapters/RuntimeTypeAdapterFactory.java

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));
于 2012-08-24T23:15:22.113 に答える
3

これにはカスタムシリアライザーが必要です。上記の Animal クラスの例を次に示します。

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();
于 2012-08-24T22:15:33.630 に答える