2012-09-20 60 views
1

我試圖用型適配器連載BasicNameValuePairs列表和GSON如何讓Gson序列化基本名稱值對列表?

ArrayList<BasicNameValuePair> kvp=new ArrayList<BasicNameValuePair>(); 
kvp.add(new BasicNameValuePair("car","ferrari")); 
kvp.add(new BasicNameValuePair("speed","fast")); 

這是結果我想

{"car":"ferrari","speed":"fast"} 

,而不是這個

[{"name":"car","value":"ferrari"},{"name":"speed","value":"fast"}] 

回答

2

序列化此根據規範,您需要製作一個自定義類型的適配器來處理通用列表。首先創建將在輸出上進行正確格式化的類。

public class KeyValuePairSerializer extends TypeAdapter<List<BasicNameValuePair>> { 
@Override 
public void write(JsonWriter out, List<BasicNameValuePair> data) throws IOException { 
    out.beginObject(); 
    for(int i=0; i<data.size();i++){ 
     out.name(data.get(i).getName()); 
     out.value(data.get(i).getValue()); 
    } 
    out.endObject(); 
} 
/*I only need Serialization*/ 
@Override 
public List<BasicNameValuePair> read(JsonReader in) throws IOException { 
    return null; 
} 
} 

然後使用自定義的Gson構建器來使用該類型的適配器來創建適當的JSON字符串。

GsonBuilder gsonBuilder= new GsonBuilder(); 
    gsonBuilder.registerTypeAdapter(KeyValuePairSerializer.class, new KeyValuePairSerializer()); 
    Gson gson=gsonBuilder.create(); 
    Logger.e(getClass().getSimpleName(),gson.toJson(kvp, KeyValuePairSerializer.class)); 
+0

反序列化函數應該是什麼樣子? – Arise

+0

http://www.mkyong.com/java/how-do-convert-java-object-to-from-json-format-gson-api/這適用於已定義的JSON對象。對於匿名用戶,您需要執行https://sites.google.com/site/gson/gson-user-guide#TOC-Serializing-and-Deserializing-Generic-Types之類的操作。 –

+1

注意:registerTypeAdapter的第一個參數應該是要序列化的類,而不是序列化程序。 –