2011-06-08 42 views
2

爲什麼這不起作用?序列化JSON對象,它擴展了地圖

public static class MyBean extends HashMap<String, String> { 
    public String city; 
} 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    MyBean bean = new MyBean(); 
    bean.city = "some city"; 

    Gson gson = new Gson(); 

    String json = gson.toJson(bean); 
    System.out.println(json); 
    } 

爲什麼我在json中看不到城市值?

+0

這是非常接近!謝謝!唯一的是,我在序列化entrySet值時得到異常線程「main」中的異常java.lang.UnsupportedOperationException:期望參數化類型,得到類java.util.HashMap $ Entry。 你是否錯過了TypeToken成語的使用? – Alexey 2011-06-08 15:40:05

回答

4

這是因爲實施Map的實例得到了Gson的特殊處理。默認情況下,只有它的入口集將被序列化。您需要創建一個自定義序列化器,該序列化器分別序列化入門集和感興趣的bean屬性。

E.g.

public class MyBeanSerializer implements JsonSerializer<MyBean> { 

    @Override 
    public JsonElement serialize(MyBean myBean, Type type, JsonSerializationContext context) { 
     JsonObject object = new JsonObject(); 
     object.add("map", context.serialize(new HashMap<String, String>(myBean))); 
     object.add("city", context.serialize(myBean.city)); 
     return object; 
    } 

} 

因而可作如下:

Gson gson = new GsonBuilder().registerTypeAdapter(MyBean.class, new MyBeanSerializer()).create(); 
String json = gson.toJson(bean); 
System.out.println(json); 

更新:嗯,按照有關問題的意見(你實際上應該已經張貼在回答讓我將立即通知),context.serialize(myBean.entrySet())似乎沒有解決。你說得對,我只是做了一個本地測試,而且得到了同樣的例外。我試着在Set<Entry<String, String>>上添加一個TypeToken,但最終以某種方式結束了一個空的入口集。用另一張地圖包裝它確實對我有用。我已經更新了答案中的一行。

+0

是的,我也提出了相同的解決方案。提前致謝!問題解決了 – Alexey 2011-06-09 07:09:42