使用Gson反序列化含随机键JSON时循环异常,结果不符合预期
解决Gson自定义反序列化嵌套Map时的重复数据问题
我一看你的问题就知道哪里出问题了——你肯定是把result2这个内层Map的初始化放在了外层循环的外面对吧?
你看你现在的循环逻辑:每次遍历外层的jsonObject条目时,直接往同一个result2里塞内层的键值对,然后把这个result2赋值给result[key]。但Map是引用类型啊,这就意味着所有外层的key指向的都是同一个result2对象。当你处理第二个外层key(也就是random2)的时候,往result2里加了新的内容,之前的random1对应的Map也会跟着变,因为它们指向的是同一个内存地址,这就导致random1的Map里莫名其妙多了random2的内容。
修复方案很简单:每次外层循环都新建一个内层Map
把result2的初始化移到外层循环里面,这样每个外层key都会对应一个全新的内层Map,互相不会干扰。
修改后的代码如下:
// 初始化外层Map Map<String, Map<String, Any>> result = new HashMap<>(); for ((key, element) in jsonObject.entrySet()) { // 关键:每次外层循环都新建一个内层Map Map<String, Any> result2 = new HashMap<>(); for ((key2, element2) in element.asJsonObject.entrySet()) { result2[key2] = element2 } result[key] = result2 }
这样处理之后,random1对应的内层Map只会包含它自己的randomKey1和randomKey2,random2对应的内层Map也只有它自己的randomKey1,完全符合你的期望输出。
内容的提问来源于stack exchange,提问作者JerryLi
相关产品推荐
相关产品推荐

