gpt4 book ai didi

java - Jackson JSON - 反序列化 Commons MultiMap

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

我想使用 JSON 序列化和反序列化 MultiMap (Apache Commons 4)。

测试代码:

MultiMap<String, String> map = new MultiValueMap<>();
map.put("Key 1", "Val 11");
map.put("Key 1", "Val 12");
map.put("Key 2", "Val 21");
map.put("Key 2", "Val 22");

ObjectMapper mapper = new ObjectMapper();
String jsonString = mapper.writeValueAsString(map);
MultiMap<String, String> deserializedMap = mapper.readValue(jsonString, MultiValueMap.class);

序列化工作正常,结果格式符合我的预期:

{"Key 1":["Val 11","Val 12"],"Key 2":["Val 21","Val 22"]}

不幸的是,反序列化产生的结果不是它应该看起来的样子:反序列化后,Multimap 在 ArrayList 中包含一个 ArrayList 作为键的值,而不是包含值的键的单个 ArrayList。

这个结果的产生是因为MultiMap实现了Map接口(interface),调用了multi map的put()方法添加json字符串中找到的数组。

如果将新值放入不存在的键中,MultiMap 实现本身会再次创建一个 ArrayList。

有什么办法可以避免这种情况吗?

感谢您的帮助!

最佳答案

根据牛津词典,circumvent 的意思是“find a way around (an obstacle)”,这里有一个简单的解决方法。

首先,我创建了一个方法来生成与您上面的方法相同的 MultiValueMap。我使用相同的方法将其解析为 json 字符串。

然后我创建了以下反序列化方法

public static MultiMap<String,String> doDeserialization(String serializedString) throws JsonParseException, JsonMappingException, IOException {

ObjectMapper mapper = new ObjectMapper();
Class<MultiValueMap> classz = MultiValueMap.class;
MultiMap map = mapper.readValue(serializedString, classz);
return (MultiMap<String, String>) map;


}

当然,这本身就属于您上面提到的确切问题,因此我创建了 doDeserializationAndFormat 方法:它将遍历与给定键对应的每个“列表中的列表”,并通过一个键的值

public static MultiMap<String, String> doDeserializationAndFormat(String serializedString) throws JsonParseException, JsonMappingException, IOException {
MultiMap<String, String> source = doDeserialization(serializedString);
MultiMap<String, String> result = new MultiValueMap<String,String>();
for (String key: source.keySet()) {


List allValues = (List)source.get(key);
Iterator iter = allValues.iterator();

while (iter.hasNext()) {
List<String> datas = (List<String>)iter.next();

for (String s: datas) {
result.put(key, s);
}
}

}

return result;

}

这是在 main 方法中的一个简单调用:

MultiValueMap<String,String> userParsedMap = (MultiValueMap)doDeserializationAndFormat(stackMapSerialized);
System.out.println("Key 1 = " + userParsedMap.get("Key 1") );
System.out.println("Key 2 = " + userParsedMap.get("Key 2") );

json to multivaluemap

希望这对您有所帮助。

关于java - Jackson JSON - 反序列化 Commons MultiMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29604319/

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