2012-07-05 83 views
1

我想創建在GSON自定義序列,在一個對象中插入一個鍵/值對,而不是一個新的對象。例如,supose這樣:序列化嵌入對(鍵/值),而不是對象與GSON

class Car { 
    @Expose 
    String model; 
    @Expose 
    Manufacturer manufacturer; 
} 

class Manufacturer { 
    @Expose 
    String name; 
    @Expose 
    String from; 
} 

我想那麼JSON是這樣的:

"car":{ 
    "model":"beatle", 
    "manufacturer":"volkswagen", 
    "country":"Germany" 
} 

但不管我怎麼編寫串行器,它堅持打造「車」內的生產對象

"manufacturer":{ 
    "name":"volkswagen", 
    "country":"Germany" 
} 

我該如何解決這個問題,只得到鍵/值對?

PS:我不能在類中做出有意義的改變,因爲它們映射了數據庫。這只是一個模擬我的問題的例子。

謝謝先進。

回答

0

我不可能做什麼我想JsonSerializer。從2.1(TypeAdapter類)開始,我只能使用GSON的新API工作。

public class ManufacturerSerializer extends TypeAdapter<Manufacturer> { 
    @Override 
    public void write(JsonWriter out, Manufacturer m) throws IOException { 
     out.value(m.getName()); 
     out.name("country"); 
     out.value(m.getFrom()); 
    } 

    /* I only need Serialization, dont use this */ 
    @Override 
    public Manufacturer read(JsonReader in) throws IOException { 
     return null; 
    } 
} 
1

使用自定義序列化程序應該有所幫助。

private class ManufacturerSerializer implements JsonSerializer<Manufacturer> { 
    public JsonElement serialize(Manufacturer src, Type typeOfSrc, JsonSerializationContext context) { 
    return new JsonPrimitive(src.getName()); // or src.name public. 
    } 
} 

參見本:https://sites.google.com/site/gson/gson-user-guide/#TOC-Custom-Serialization-and-Deserialization

+1

所以,它給了我 「車」:{ 「模式」: 「甲殼蟲」, 「製造商」: 「大衆汽車」 } 但我需要插入 「國」: 「德國」 雙我也不知道該怎麼做這個代碼 – tpcordeiro 2012-07-05 13:21:36

0

你應該定義你自己的Car類,這將避免剛剛序列化的瑣碎的方式合成類,但會使你需要的東西serializerdeserializer

這是不難的,例如,你將定義

class CarSerializer implements JsonSerializer<Car> { 
    JsonElement serialize(Car src, Type typeOfSrc, JsonSerializationContext context) { 
    JsonObject o = new JsonObject(); 
    o.addProperty("manufacturer", src.manufacturer.name); 
    ... 
    } 
} 

記住,你需要註冊串行作爲文檔解釋。

+0

對不起,我忘記解釋了,我不想創建一個自定義序列化到Car類。相反,我需要序列化製造商類,因爲汽車類有許多和許多其他屬性(可以更改,包括)。 – tpcordeiro 2012-07-05 13:17:07

相關問題