【问题标题】:Remove jsonnode which contains a specific word删除包含特定单词的 jsonnode
【发布时间】:2019-05-18 07:28:48
【问题描述】:

我在Java中使用Jackson lib生成了下面的Json:

{
    "name": "name1",
    "version": "0.0.1",
    "storage": {
        "db": {
            "test_field1": "STRING",
            "t_dlm1": "STRING",
            "test_field2": "STRING",
            "t_dlm2": "STRING"

        },
        "test": {
            "test11": "STRING",
            "test2": {
                "test3": "0",
                "r_dlm4": "0"
            },
            "test5": {
                "test6": "0",
                "h_dlm7": "0"
            }
        },
        "test8": {
            "test9": "STRING",
            "f_dlm10": "STRING"
        }
    }
}

现在我要求删除那些包含“dlm”字的json节点或字段(键和值)。

我尝试了 remove 和 removeAll 方法,我可以删除特定字段但需要传递字段的完整名称。

我这里有点新,如果字段名包含“dlm”字,请在这里指导我如何删除 json 节点

预期的 json:

   {
"name": "name1",
"version": "0.0.1",
"storage": {
    "db": {
        "test_field1": "STRING",

        "test_field2": "STRING"


    },
    "test": {
        "test11": "STRING",
        "test2": {
            "test3": "0"

        },
        "test5": {
            "test6": "0"

        }
    },
    "test8": {
        "test9": "STRING"

    }
}
}

【问题讨论】:

    标签: java fasterxml jackson2 jackson-databind


    【解决方案1】:

    我认为您需要遍历所有节点以检查包含“dlm”的键。

    您可以使用 jayway 的 JsonPath 来获取使用 Option.AS_PATH_LIST 的所有路径的列表,然后循环这些路径并删除任何包含 dlm。

        Configuration conf = Configuration.builder()
                .options(Option.AS_PATH_LIST).build();
    
        DocumentContext parsedJson = JsonPath.using(conf).parse(json);
        List<String> pathList = parsedJson.read("$..*");
    
        for (String path : pathList) {
            if (path.contains("dlm")) {
                parsedJson.delete(path);
            }
        }
    
        String result = parsedJson.jsonString();
    

    我怀疑您可以使用合适的路径来选择所有带有 dlm 的元素。您可以应用过滤器并使用正则表达式,尽管我看不到如何在过滤器中使用元素名称(即 xpath 中的 /name() 之类的东西)。

    注意:如果您的嵌套节点带有“dlm”,则上述代码可能会在尝试删除内部节点之前删除外部节点,因此您可能会遇到未找到路径的异常。

    JsonPath 引入了 json-smart 作为依赖项并默认使用它。如果你想让它使用杰克逊,你必须告诉它。例如:

        Configuration conf = Configuration.builder()
                .jsonProvider(new JacksonJsonProvider())
                .mappingProvider(new JacksonMappingProvider())
                .options(Option.AS_PATH_LIST)
                .build();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-19
      • 1970-01-01
      • 1970-01-01
      • 2018-10-11
      • 2023-03-24
      • 2016-02-02
      相关资源
      最近更新 更多