這是因爲實施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
,但最終以某種方式結束了一個空的入口集。用另一張地圖包裝它確實對我有用。我已經更新了答案中的一行。
這是非常接近!謝謝!唯一的是,我在序列化entrySet值時得到異常線程「main」中的異常java.lang.UnsupportedOperationException:期望參數化類型,得到類java.util.HashMap $ Entry。 你是否錯過了TypeToken成語的使用? – Alexey 2011-06-08 15:40:05