为什么这不起作用?
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 中看不到城市值?
那是因为实例实现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())
似乎没有解决。你是对的,我刚刚做了一个本地测试,我得到了同样的例外。我尝试添加一个TypeToken
on Set<Entry<String, String>>
,但最终以某种方式得到了一个空的条目集。将它包装在另一张地图中确实对我有用。我已经更新了答案中的行。
归档时间: |
|
查看次数: |
3049 次 |
最近记录: |