gpt4 book ai didi

java - 使用 Jackson 对具有整数键的 map 进行反序列化

转载 作者:搜寻专家 更新时间:2023-10-31 19:27:28 39 4
gpt4 key购买 nike

我必须将一个简单的整数到字符串映射序列化为 JSON,然后读回它。序列化非常简单,但是由于 JSON 键必须是字符串,因此生成的 JSON 如下所示:

{
"123" : "hello",
"456" : "bye",
}

当我使用如下代码阅读它时:

new ObjectMapper().readValue(json, Map.class)

我得到的是 Map<String, String> 而不是我需要的 Map<Integer, String>

我尝试按如下方式添加 key 解串器:

    Map<Integer, String> map1 = new HashMap<>();
map1.put(1, "foo");
map1.put(2, "bar");


ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addKeyDeserializer(Integer.class, new KeyDeserializer() {
@Override
public Object deserializeKey(String key, DeserializationContext ctxt) throws IOException, JsonProcessingException {
System.out.println("deserialize " + key);
return Integer.parseInt(key);
}
});

mapper.registerModule(module);
String json = mapper.writeValueAsString(map1);


Map map2 = mapper.readValue(json, Map.class);
System.out.println(map2);
System.out.println(map2.keySet().iterator().next().getClass());

不幸的是,我的 key deserialzier 从未被调用过,而 map2 实际上是 Map<String, String> ,所以我的示例打印:

{1=foo, 2=bar}
class java.lang.String

我做错了什么以及如何解决这个问题?

最佳答案

使用

Map<Integer, String> map2 = 
mapper.readValue(json, new TypeReference<Map<Integer, String>>(){});

    Map<Integer, String> map2 = 
mapper.readValue(json, TypeFactory.defaultInstance()
.constructMapType(HashMap.class, Integer.class, String.class));

您的程序将输出以下文本:

deserialize 1
deserialize 2
{1=foo, 2=bar}
class java.lang.Integer

关于java - 使用 Jackson 对具有整数键的 map 进行反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31230918/

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