gpt4 book ai didi

java - 包装类的 GSON 反/序列化

转载 作者:行者123 更新时间:2023-11-30 07:44:23 30 4
gpt4 key购买 nike

我有一个 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。

最佳答案

为您的类型实现自定义 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

关于java - 包装类的 GSON 反/序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34123721/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com