2012-09-20 49 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的第一个参数应该是要序列化的类,而不是序列化程序。 –