0

在使用 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 使用相同的而不是替换现有项目时,它最终会添加另一个元素而不是像下面那样在索引零处写入

{
    "string": "string",
    "json": {
        "items": [
            "<newly-written-item>"
            "item-1",
            "item-2",
            "item-3"
        ]
    }
}

是否可以覆盖现有值而不是在索引处添加?

4

1 回答 1

0

我认为这是不可能的,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"]}}
于 2022-02-03T14:27:34.893 回答