javax.json 奇怪的行为

标签 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());

这是输出:

Info:   JSON1: {"l1":[{"test1":"test1"},{"test2":"test2"}],"otherParam":"value2"}
Info:   JSON2: {}

我认为第二个 JSON 是 {"test1":"test1"}。我错了吗?
问题似乎与 .build() 函数有关,该函数将添加到 HASH_MAP 的元素的所有 valueMap 设置为 null(请参阅图片)。 enter image description here

如何让 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/

相关文章:

java - 无法执行目标 org.apache.maven.plugins :maven-antrun-plugin

正则表达式

java - Spring MVC、域对象和@JsonIgnore

json - 如何加入嵌套的 jsonb 数组元素?

java - 如何更新放入 JTextField 的文件中的行

java ReplaceAll(regex, replacement) 正则表达式命令

android - 无法从 android 解析 JSON,因为 asp.net 服务器不返回数组名称

json - Play Json 添加类中不存在的字段

java - 对 String[] 数组的数组列表进行排序

javascript - Vue.js 中来自 JSON 对象的值