首页 > 解决方案 > 使用杰克逊在 JSON 中插入和删除内部节点?

问题描述

我有一个复杂的 json 和一个键列表,它们代表我想要访问、删除或插入的特定节点的任意长“路径”。
那可能吗?
例如对于 json

{
  "token": {
    "d1": 3000,
    "d2": [
      {
        "d3": "a1",
        "d4": "a2"
      }
    ],
    "d5": [
      "d6",
      "d7"
    ],

  "d8": {
    "d9": true,
    "d10": 10000
  }
}

和清单

['token','d2','d3']

对于插入命令,结果

removeFromJson(jsonString,key_path)

将会

{
  "token": {
    "d1": 3000,
    "d2": [
      {
        "d4": "a2"
      }
    ],
    "d5": [
      "d6",
      "d7"
    ],

  "d8": {
    "d9": true,
    "d10": 10000
  }
}

标签: javajacksonjsonparser

解决方案


JsonNode正如托马斯在评论中提到的那样,我会依靠它getremove方法。就像是:

public void remove(String json, List<String> path) {

    JsonNode root = new ObjectMapper.readTree(json);

    int lastIndex = path.size() - 1;

    for (int i = 0; i < lastIndex; i++) {
        root = root.get(path.get(i));
    }

    root = root.remove(path.get(lastIndex));

    return root;
}

您可以使用子列表或流进一步优化迭代,并且您可能希望处理您的路径实际上不会导致给定 json 中的任何内容的情况。

注意:如果您需要在任意对象内的任意路径上执行此行为,则此选项有效 -JsonNode适用于您不知道将获得什么的情况。如果你确实知道你会得到什么(从同一个对象中删除总是相同的东西),最好的形式是使用映射器将 JSON 反序列化为一个对象,该映射器设置忽略对象中缺少但存在于JSON。


推荐阅读