Я создал ниже Json, используя Jackson lib в Java:
{
"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"
}
}
}
Теперь я требую удалить тот узел или поле json (ключ и значение), которые содержат слово "dlm".
Я попытался удалить и удалить все методы, поэтому я могу удалить конкретное поле, но мне нужно передать полное точное имя поля.
Я здесь немного новичок, пожалуйста, расскажите мне, как удалить узел json, если имя поля содержит слово "dlm"
ожидаемый 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"
}
}
}
Я думаю, вам нужно обойти все узлы, проверяя наличие ключа, содержащего dlm.
Вы можете использовать JsonPath jayway, чтобы получить список всех путей с помощью 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. Вы можете применять фильтры и использовать регулярное выражение, хотя я не вижу, как использовать имя элемента в фильтре (т.е. что-то вроде / name () в xpath).
Примечание: если у вас есть вложенные узлы с 'dlm', приведенный выше код может удалить внешний узел, прежде чем пытаться удалить внутренний, поэтому вы можете получить исключение "путь не найден".
JsonPath включает json-smart в качестве зависимости и использует ее по умолчанию. Если вы хотите, чтобы он использовал Джексона, вы должны это сказать. например.:
Configuration conf = Configuration.builder()
.jsonProvider(new JacksonJsonProvider())
.mappingProvider(new JacksonMappingProvider())
.options(Option.AS_PATH_LIST)
.build();