javax.json奇怪的行为

use*_*708 5 java json

我不明白为什么这段代码的最后一行返回一个空字符串.

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未触及的范围内?

Ctx*_*Ctx 5

之后build()荷兰国际集团一个JsonObjectJsonObjectBuilder建筑工地被清除以备再用。为了说明这一点:

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)

现在,它应该可以按预期工作。