为什么这不起作用?
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 :(得分: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())
似乎没有锻炼身体。而你是对的,我刚做了一次本地测试,我得到了同样的例外。我尝试在TypeToken
上添加Set<Entry<String, String>>
,但最终以某种方式结束了一个空的入口集。将它包装在另一张地图中确实对我有用。我在答案中更新了这一行。