【问题标题】:GSON de/serialization of wrapper class包装类的 GSON 反序列化
【发布时间】:2015-12-06 22:38:30
【问题描述】:

我有一个 Map 的便利类包装器,看起来像这样:

class MapWrapper {
    private Map<String, Integer> wrapped = new HashMap<>();

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

我不直接使用 Map 而是使用包装器的原因是因为我需要使用方法来间接访问 Map。

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

{
  "key1":1,
  "key2":2
}

对于我的 JSON 输入/输出而不是(仅传递给 GSON 的默认值是什么):

{
  wrapped: {
    "key1":1,
    "key2":2
  }
}

如果重要,此对象将包含在另一个对象中,因此 GSON 上下文反序列化将能够说该对象是 MapWrapper 而不仅仅是 Map。

【问题讨论】:

    标签: java json serialization gson


    【解决方案1】:

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

    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 实例时注册它:

    Gson gson = new GsonBuilder()
                .registerTypeAdapter(MapWrapper.class, new MyTypeAdapter())
                .create();
    

    你应该可以这样称呼它:

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

    这应该打印出来:

    {"key1":1,"key2":2}
    key1, 1
    key2, 2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-07
      • 2015-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多