我不明白为什么这段代码的最后一行返回一个空字符串。
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());
这是输出:
Info: JSON1: {"l1":[{"test1":"test1"},{"test2":"test2"}],"otherParam":"value2"}
Info: JSON2: {}
我认为第二个 JSON 是 {"test1":"test1"}
。我错了吗?
问题似乎与 .build()
函数有关,该函数将添加到 HASH_MAP
的元素的所有 valueMap 设置为 null(请参阅图片)。
如何让 HASH_MAP
中的值保持不变?
最佳答案
在 build()
从 JsonObjectBuilder
生成 JsonObject
之后,构建器被清除以准备重用.为了说明这一点:
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()); // {}
当你做的时候
l1.add(l.getValue()); // l.getValue() is (JsonObjectBuilder) one at some time
build()
在 one
上被隐式调用,因此它被清空了。
然后在这里:
System.out.println("JSON2: " + HASH_MAP.get("one").build().toString());
您构建空 JsonObject
的表示。
为了解决这个问题,您可以在 HashMap 中存储 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());
现在它应该可以按预期工作了。
关于javax.json 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35187129/