我不明白为什么这段代码的最后一行返回一个空字符串.
Map<String, JsonObjectBuilder> HASH_MAP = new HashMap<>();
JsonObjectBuilder one = Json.createObjectBuilder();
one.add("test1","test1");
HASH_MAP.put("one", one);
JsonObjectBuilder two = Json.createObjectBuilder();
two.add("test2","test2");
HASH_MAP.put("two", two);
JsonObjectBuilder toReturn = Json.createObjectBuilder();
JsonArrayBuilder l1 = Json.createArrayBuilder();
for (Map.Entry<String, JsonObjectBuilder> l : HASH_MAP.entrySet()) {
l1.add(l.getValue());
}
toReturn.add("l1", l1);
toReturn.add("otherParam", "value2");
String strJSON = toReturn.build().toString();
System.out.println("JSON1: " + strJSON);
System.out.println("JSON2: " + HASH_MAP.get("one").build().toString());
Run Code Online (Sandbox Code Playgroud)
这是输出:
Info: JSON1: {"l1":[{"test1":"test1"},{"test2":"test2"}],"otherParam":"value2"}
Info: JSON2: {}
Run Code Online (Sandbox Code Playgroud)
我想第二个JSON是{"test1":"test1"}.我错了?
这个问题似乎是与链接.build()设置所有的功能valueMap加入的元素HASH_MAP为null(见图片).

如何将值保留在HASH_MAP未触及的范围内?
之后build()荷兰国际集团一个JsonObject从JsonObjectBuilder建筑工地被清除以备再用。为了说明这一点:
JsonObjectBuilder b = Json.createObjectBuilder();
b.add("foo", "bar");
JsonObject o = b.build();
JsonObject p = b.build();
System.out.println(o.toString()); // {"foo":"bar"}
System.out.println(p.toString()); // {}
Run Code Online (Sandbox Code Playgroud)
当你做
l1.add(l.getValue()); // l.getValue() is (JsonObjectBuilder) one at some time
Run Code Online (Sandbox Code Playgroud)
build()被称为隐式上one,因此它被清空。
然后在这里:
System.out.println("JSON2: " + HASH_MAP.get("one").build().toString());
Run Code Online (Sandbox Code Playgroud)
您建立一个空的表示JsonObject。
为了缓解这种情况,您可以例如在哈希图中存储JsonObjects而不是JsonObjectBuilders:
Map<String, JsonObject> HASH_MAP = new HashMap<>();
JsonObjectBuilder one = Json.createObjectBuilder();
one.add("test1","test1");
HASH_MAP.put("one", one.build());
JsonObjectBuilder two = Json.createObjectBuilder();
two.add("test2","test2");
HASH_MAP.put("two", two.build());
JsonObjectBuilder toReturn = Json.createObjectBuilder();
JsonArrayBuilder l1 = Json.createArrayBuilder();
for (Map.Entry<String, JsonObject> l : HASH_MAP.entrySet()) {
l1.add(l.getValue());
}
toReturn.add("l1", l1);
toReturn.add("otherParam", "value2");
String strJSON = toReturn.build().toString();
System.out.println("JSON1: " + strJSON);
System.out.println("JSON2: " + HASH_MAP.get("one").toString());
Run Code Online (Sandbox Code Playgroud)
现在,它应该可以按预期工作。
| 归档时间: |
|
| 查看次数: |
1022 次 |
| 最近记录: |