【发布时间】:2016-07-09 08:06:45
【问题描述】:
我想用 List 和 hashmap 创建一个 Json 数组对象,但是在程序执行过程中遇到了一些奇怪的问题。
这是我的代码:
List<HashMap> list = new ArrayList<>();
HashMap<String, String> hmap = new HashMap<>();
String raw = "<CONTENT><DETAIL><USER>user1</USER><MAIL>abc@test.com</MAIL></DETAIL><DETAIL><USER>user2</USER><MAIL>def@test.com</MAIL></DETAIL></CONTENT>";
String partRas = "";
int index = raw.indexof("<USER>");
while(index >= 0) {
if(index + 50 < raw.length())
partRaw = raw.subString(index, index + 50);
hmap("user", getTagValue(partRaw, "USER"));
hmap("email", getTagValue(partRaw, "MAIL"));
list.add(hmap);
raw = raw.subString(index + 50, raw.length());
index = raw.indexof("<USER>");
}
System.out.println(new Gson().toJson(list));
public static String getTagValue(String xml, String tagName){
return xml.split("<"+tagName+">")[1].split("</"+tagName+">")[0];
}
这段代码看起来合法,但是当我执行这段代码时,我预计会得到这样的结果:
[{"user":"user1","email":"abc@test.com"},{"user":"user2","email":"def@test.com"}]
但我得到的是这样的:
[{"user":"user2","email":"def@test.com"},{"user":"user2","email":"def@test.com"}]
我能想到的这个问题的唯一答案是“它是通过地址传递”,所以我推入列表的第一个结果受到第二次迭代的影响。
我想问的问题:有谁知道得到我想要的结果的方法吗?
我不希望答案告诉我在一开始就定义多个 HashMap,因为我的原始数据可能包含更多“”,这意味着它可以包含尽可能多的“USER”和“MAIL”数据。
【问题讨论】:
-
此代码不是minimal reproducible example。特别是它没有显示
map的定义位置。如果我要猜,那是你的问题。每次开始解析新用户条目时,您都不会创建map的新实例 - 因此旧条目中的值只会不断被覆盖。 (hmap应该是map吧?)。 -
打字错误,现已更正。
-
@Tibrogargan 这是否意味着我必须在 while 循环内的每次迭代中动态定义新的 HashMap?
-
我会做一个答案,更容易告诉你