我使用Java中的Jackson库在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"
}
}
}
答案 0 :(得分:0)
我认为您需要遍历所有节点以检查包含'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();