2012-08-23 6 views
11

は、私は以下のクラスを持っていると言うことができますクラス名を追加しますGsonですべてのクラスのclassNameを自動的に追加したいので、次の結果が得られます。Gsonは自動的

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

誰かが、これが何らかの種類のインターセプタやGsonのもので可能かどうかを知っていますか?

答えて

3

これにはカスタムシリアライザが必要です。ここでは上記の動物クラスの例です:

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(); 
+1

これは本当に問題を解決しませんか?私はすべてのフィールドに標準的なシリアライゼーションを使用したいが、クラス名のために1つの追加フィールドを追加する - 本当に普通のユースケースのように感じる。 – mjaggard

+0

問題は、通常のシリアライゼーションに単一のフィールドを追加したいということです。私の解決策では(特に余分な依存関係に頼ることなく)その問題が解決されます。私はそれが一種の痛みだと理解していますが、カスタムシリアライザを作成して登録することなくこの単純な作業を達成する方法ではない/そうではないようです。 –

14

は見てみましょうこれは: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)); 
+1

これは私が必要とするものです!そのクラスはGsonにはありません。コードベースにRuntimeTypeAdapterFactory.javaを含める必要がありますか?あるいは、それを図書館として入手する方法がありますか? – paj28

+1

ええ、コードに追加する必要があります。 –

+0

これも今公開されています:https://mvnrepository.com/artifact/org.danilopianini/gson-extras/0.1.0 – pandaadb