2013-10-10 108 views
2

裏面我有一些對象如何使用自定義JSON序列另一個串行

public class MyObject { 
    private String name; 
    private String city; 
    public MyObject(String n, String c) { 
     name=n; city=c;} 
    public String getName() {return name;} 
    public String getCity() {return city;} 
    public void setName(String n) {name=n;} 
    public void setCity(String c) {city =c;} 
} 

,我有一個自定義序列:

public class MySerializer implements JsonSerializer<MyObject> { 
public JsonElement serialize(final MyObject myobj, final Type type,  JsonSerializationContext context) { 
    JsonObject result = new JsonObject(); 
    result.add("id", new JsonPrimitive(myobj.getName())); 
    return result; 
} 
} 

基本上我只是想只的21到24 serilize領域。做這樣的事情,當這個偉大的工程:

 GsonBuilder builder = new GsonBuilder(); 
     builder.registerTypeAdapter(MyObject.class, new MySerialize()); 
     Gson gson = builder.create(); 
     System.out.println(gson.toJson(new MyObject("test","something")); 

但它變得更復雜一點(這裏是我的問題)時,我有一個是由「myObject的」 S另一個對象。我怎樣才能得到正確的序列化程序只序列化MyObject的一個字段。

,所以我有另一個類:

public class SomeObject { 
    private String id; 
    private MyObject foo; 
    private MyObject bar; 
    ... 
} 

和我有一個自定義序列:

public JsonElement serialize(final SomeObject something, final Type type,   JsonSerializationContext context) { 
    JsonObject result = new JsonObject(); 
    Gson gson = new Gson(); 
      result.add("id", new JsonPrimitive(something.getId())); 

      //here i need help 
      result.add("myobject1", new JsonPrimitive(gson.toJson(something.getFoo()))); 

      return result; 
     } 

我不知道,如果它的最佳實踐,爲「MyObject來」創造GsonBuilder內SomeObject的自定義序列化程序是什麼?

香港專業教育學院嘗試類似:

GsonBuilder builder = new GsonBuilder(); 
builder.registerTypeAdapter(MyObject.class, new MySerialize()); 
builder.registerTypeAdapter(SomeObject.class, new SomeObjectSerializer()); 
Gson gson = builder.create(); 
System.out.println(gson.toJson(new SomeObject("id",new MyObject("test","something"),new     MyObject("test2,"barrrrr")); 

,我會怎樣exepct 「{」 ID 「:」 ID 「 」富「{ 」ID「: 」測試「}, 」吧「:{」 ID :「test2」}}

但事實並非如此。 bascially我想只是自定義對象中的第一個字段,因爲我有一個Seralizer,但是我需要在另一個對象自定義序列化器中構建該序列化程序嗎?似乎錯了,不知道爲什麼。

回答

2

請注意您如何訪問自定義JsonSerializer類中的JsonSerializationContext。您可以撥打電話JsonSerializationContext#serialize(Object),Gson將使用已註冊或默認TypeAdapter序列化該對象,並返回JsonElement,您可以將其添加到外部JsonElement

+1

剛剛嘗試過,並得到相同的結果。我如何知道SomeObjectSerializer()是否已經在上下文中定義。例如,即時將它添加到GsonBuilder(),然後調用「create」來獲取toJson字符串,但它似乎沒有被調用。 – user1772250

+0

@user嘗試調試並檢查在調用'JsonSerializationContext#serialize()'時是否實際註冊了'SomeObjectSerializer'。 –

相關問題