【发布时间】:2020-12-16 14:24:42
【问题描述】:
无法直接替换 javax.json.JsonObject 中的值,因为 javax.json.JsonObject 实现了不可变映射。为此,您必须创建一个新的 JsonObject 并将值从原始值复制到新的值中,并注意替换您要替换的值。 我找到了如何使用“简单”JsonObject 执行此操作的示例,其中没有嵌套的 JsonObjects。我正在寻找的是一个通用的替换实现,其中我传递了一个 JsonObject、属性名称和新值。此方法应该“遍历” JsonObject 并替换属性(无论它在对象层次结构中的哪个位置)并保持其他属性不变。 例如。这是我原来的 JsonObject
{
"Attr1":number1,
"Attr2":number2,
"Attr3":number3,
"Attr4":[
"string1"
],
"Attr5":[
{
"Attr6":[
{
"Attr7":"string2",
"Attr8":"string3",
"$Attr9":number4
},
{
"Attr7":"string4",
"Attr8":"string5",
"Attr9":number5
}
],
"Attr10":number6,
"Attr14":{
"Attr10":"string6",
"Attr11":"string7",
"Attr12":"string8"
},
"Attr13":[
"string9",
"string10"
],
"Attr14":"string11"
}
]
}
我想用字符串数组而不是 JsonObjects 数组替换 Attr6:
"Attr6":["newString1","newString2"],
相应的调用可能类似于 replaceValue(JsonObject jObj, String attrName, JsonValue newValue)) ,其中“jObj”是整个 Json,“attrName”是“Attr6”,“newValue”是包含两个字符串的 JsonArray。
有人可以指出一个实现此类功能的示例或帮助我吗?
我自己尝试过,但它并没有真正起作用,因为每次递归迭代都会重新创建构建器(或者更可能是因为它全错了...... :))
public static JsonObject replaceValue( final JsonObject jsonObject, final String jsonKey, final JsonValue jsonValue )
{
JsonObjectBuilder builder = Json.createObjectBuilder();
if(jsonObject == null)
{
return builder.build();
}
Iterator<Entry<String, JsonValue>> it = jsonObject.entrySet().iterator();
while (it.hasNext())
{
@SuppressWarnings( "rawtypes" )
JsonObject.Entry mapEntry = it.next();
if (mapEntry.getKey() == jsonKey)
{
builder.add(jsonKey, jsonValue);
}
else if (ValueType.STRING.equals(((JsonValue) mapEntry.getValue()).getValueType()) || ValueType.NUMBER.equals(((JsonValue) mapEntry.getValue()).getValueType()) || ValueType.TRUE.equals(((JsonValue) mapEntry.getValue()).getValueType()) ||
ValueType.FALSE.equals(((JsonValue) mapEntry.getValue()).getValueType()) || (JsonValue) mapEntry.getValue() == null || "schemas".equalsIgnoreCase((String) mapEntry.getKey()))
{
builder.add(mapEntry.getKey().toString(), (JsonValue) mapEntry.getValue());
}
else if (ValueType.OBJECT.equals(((JsonValue) mapEntry.getValue()).getValueType()))
{
JsonObject modifiedJsonobject = (JsonObject) mapEntry.getValue();
if (modifiedJsonobject != null)
{
replaceValue(modifiedJsonobject, jsonKey, jsonValue);
}
}
else if (ValueType.ARRAY.equals(((JsonValue) mapEntry.getValue()).getValueType()))
{
for (int i = 0; i < ((JsonValue) mapEntry.getValue()).asJsonArray().size(); i++)
{
replaceValue((JsonObject) ((JsonValue) mapEntry.getValue()).asJsonArray().get(i), jsonKey, jsonValue);
}
}
}
return builder.build();
}
【问题讨论】:
-
如果有多个同名的键嵌套在不同的 JSON 对象中怎么办?那该换哪一个呢?
-
假设key在整个JsonObject中是唯一的。
-
您是否仅限于使用
javax.json,还是可以使用其他库,例如 Jackson 或 Gson? -
是的,我必须使用 javax.json