首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >包装类的GSON反序列化

包装类的GSON反序列化
EN

Stack Overflow用户
提问于 2015-12-06 22:38:30
回答 1查看 2.6K关注 0票数 2

我为Map提供了一个方便的类包装器,它如下所示:

代码语言:javascript
复制
class MapWrapper {
    private Map<String, Integer> wrapped = new HashMap<>();

    public void add(String key, Integer count) {/*implementation*/}
    // Other modifiers
}

我之所以不是直接使用Map,而是使用包装器,是因为我需要使用这些方法间接地访问Map。

当我反/序列化这个对象时,我希望JSON序列化,就像包装类不存在一样。我想:

代码语言:javascript
复制
{
  "key1":1,
  "key2":2
}

对于我的/output中的JSON,而不是(传递给GSON的缺省值是什么):

代码语言:javascript
复制
{
  wrapped: {
    "key1":1,
    "key2":2
  }
}

如果重要的话,这个对象将包含在另一个对象中,这样GSON上下文反序列化就可以说该对象是一个MapWrapper,而不仅仅是一个映射。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-07 16:34:18

为您的类型实现自定义的JsonSerializer / JsonDeserializer:

代码语言:javascript
复制
public class MyTypeAdapter implements JsonSerializer<MapWrapper>, JsonDeserializer<MapWrapper> {
    @Override
    public JsonElement serialize(MapWrapper src, Type typeOfSrc, JsonSerializationContext context) {
        JsonObject obj = new JsonObject();
        src.wrapped.entrySet().forEach(e -> obj.add(e.getKey(), new JsonPrimitive(e.getValue())));
        return obj;
    }

    @Override
    public MapWrapper deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        MapWrapper wrapper = new MapWrapper();
        json.getAsJsonObject().entrySet().forEach(e -> wrapper.wrapped.put(e.getKey(), e.getValue().getAsInt()));
        return wrapper;
    }
}

然后在构造Gson实例时注册它:

代码语言:javascript
复制
Gson gson = new GsonBuilder()
            .registerTypeAdapter(MapWrapper.class, new MyTypeAdapter())
            .create();

你应该可以这样称呼它:

代码语言:javascript
复制
MapWrapper wrapper = new MapWrapper();
wrapper.wrapped.put("key1", 1);
wrapper.wrapped.put("key2", 2);

String json = gson.toJson(wrapper, MapWrapper.class);
System.out.println(json);

MapWrapper newWrapper = gson.fromJson(json, MapWrapper.class);
for(Entry<String, Integer> e : newWrapper.wrapped.entrySet()) {
    System.out.println(e.getKey() + ", " + e.getValue());
}

这应该打印:

代码语言:javascript
复制
{"key1":1,"key2":2}
key1, 1
key2, 2
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34123721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档