序列化扩展map的json对象

时间:2011-06-08 14:46:55

标签: java json gson

为什么这不起作用?

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中看不到城市价值?

1 个答案:

答案 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>>,但最终以某种方式结束了一个空的入口集。将它包装在另一张地图中确实对我有用。我在答案中更新了这一行。