在使用Vert.x时,为了操作JSON,我使用了一个JSON指针。最近,我们发现必须对JSON数组进行同样的处理。
这是我试过的示例代码。
String jsonInput = "{\"string\":\"string\",\"json\":{\"items\":[\"item-1\",\"item-2\",\"item-3\"]}}";
JsonObject json = new JsonObject(jsonInput);
JsonPointer pointer = JsonPointer.from("/json/items/0");
System.out.println(pointer.writeJson(json,"new item"));将此作为输入
{
"string": "string",
"json": {
"items": [
"item-1",
"item-2",
"item-3"
]
}
}指向item-1的指针将是/json/items/0。当我对Vert.x中的JsonPointer使用相同的方法而不是替换现有的项时,它最终会添加另一个元素,而不是在索引0处写入,如下所示
{
"string": "string",
"json": {
"items": [
"<newly-written-item>"
"item-1",
"item-2",
"item-3"
]
}
}是否可以覆盖现有值而不是在索引处添加?
发布于 2022-02-03 14:27:34
我认为writeJson()是不可能的,因为它总是在给定的索引处添加新元素。在vertx的存储库实现中,您可以看到vertx总是使用以下方法编写数组元素,而数组元素只能添加一个新元素:
public boolean writeArrayElement(Object value, int i, Object el) {
if (isArray(value)) {
try {
((JsonArray)value).getList().add(i, el);
return true;
} catch (IndexOutOfBoundsException e) {
return false;
}
} else return false;
}对于JsonObjects,vertx使用以下方法,它将替换现有值:
@Override
public boolean writeObjectParameter(Object value, String key, Object el) {
if (isObject(value)) {
((JsonObject)value).put(key, el);
return true;
} else return false;
}一个可能的解决办法是查询JsonArray并手动替换数组元素,如下所示:
String jsonInput = "{\"string\":\"string\",\"json\":{\"items\":[\"items-1\",\"item-2\",\"item-3\"]}}";
JsonObject json = new JsonObject(jsonInput);
JsonPointer pointer = JsonPointer.from("/json/items");
JsonArray jsonArray = (JsonArray) pointer.queryJson(json);
jsonArray.remove(0);
jsonArray.add(0, "new item");
System.out.println(json);输出:
{"string":"string","json":{"items":["new item","item-2","item-3"]}}https://stackoverflow.com/questions/70971970
复制相似问题