序列化扩展地图的json对象

Ale*_*xey 2 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);
    }
Run Code Online (Sandbox Code Playgroud)

为什么我在 json 中看不到城市值?

Bal*_*usC 6

那是因为实例实现Map有 Gson 的特殊处理。默认情况下,只有它的条目集会被序列化。您需要创建一个自定义序列化程序,它分别序列化感兴趣的条目集和 bean 属性。

例如

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

可以按如下方式使用:

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

更新:嗯,根据对该问题的评论(您实际上应该将其发布在答案上,以便我会立即收到通知),context.serialize(myBean.entrySet())似乎没有解决。你是对的,我刚刚做了一个本地测试,我得到了同样的例外。我尝试添加一个TypeTokenon Set<Entry<String, String>>,但最终以某种方式得到了一个空的条目集。将它包装在另一张地图中确实对我有用。我已经更新了答案中的行。