gpt4 book ai didi

java - 使用 GSon 反序列化 Map

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:39:22 27 4
gpt4 key购买 nike

我有一个包含多种类型的 Map,就像这个简单的例子一样

final Map<String, Object> map = new LinkedHashMap<String, Object>();
map.put("a", 1);
map.put("b", "a");
map.put("c", 2);
final Gson gson = new Gson();
final String string = gson.toJson(map);
final Type type = new TypeToken<LinkedHashMap<String, Object>>(){}.getType();
final Map<Object, Object> map2 = gson.fromJson(string, type);
for (final Entry<Object, Object> entry : map2.entrySet()) {
System.out.println(entry.getKey() + " : " + entry.getValue());
}

我得到的是普通的Object,没有Integer,没有String。输出看起来像

a : java.lang.Object@48d19bc8
b : java.lang.Object@394a8cd1
c : java.lang.Object@4d630ab9

我能以某种方式修复它吗?我希望默认情况下能够正确处理这种简单的情况。

我知道关于类型的信息不能总是保留下来,可能 1"1" 在 JSON 中的意思完全一样。但是,返回无内容的普通对象对我来说毫无意义。

更新:序列化版本(即上面的 string)看起来不错:

{"a":1,"b":"a","c":2}

最佳答案

Gson 没那么聪明。而是提供一个 Javabean 类风格的清晰静态数据结构,以便 Gson 了解应该将单独的属性反序列化为什么类型。

例如

public class Data {
private Integer a;
private String b;
private Integer c;
// ...
}

结合

Data data1 = new Data(1, "a", 2);
String json = gson.toJson(data1);
Data data2 = gson.fromJson(json, Data.class);

更新:根据评论,键集似乎没有固定(尽管您似乎可以事后手动转换它而无需事先了解结构)。你可以创建一个 custom deserializer .这是一个简单的示例。

public class ObjectDeserializer implements JsonDeserializer<Object> {

@Override
public Object deserialize(JsonElement element, Type type, JsonDeserializationContext context) throws JsonParseException {
String value = element.getAsString();
try {
return Long.valueOf(value);
} catch (NumberFormatException e) {
return value;
}
}

}

您按如下方式使用:

final Gson gson = new GsonBuilder().registerTypeAdapter(Object.class, new ObjectDeserializer()).create();
// ...

关于java - 使用 GSon 反序列化 Map<Object, Object>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5396578/

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