Удалить jsonnode, который содержит определенное слово - PullRequest
0 голосов
/ 18 декабря 2018

Я сгенерировал ниже Json, используя библиотеку Джексона в 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".

Я пытался удалить и удалить метод All, с этим я могу удалить определенное поле, но мне нужно передать полное точное имя поля.

Я немного новичок здесь, пожалуйста, направьте меня сюдакак удалить узел 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"

    }
}
}

1 Ответ

0 голосов
/ 18 декабря 2018

Я думаю, вам нужно обойти все узлы, проверяя наличие ключа, содержащего 'dlm'.

Вы можете использовать jayway's 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.Вы можете применять фильтры и использовать регулярные выражения, хотя я не вижу, как использовать имя элемента в фильтре (например, что-то вроде / name () в xpath).

Примечание: если у вас есть вложенные узлыс помощью 'dlm' вышеприведенный код вполне может удалить внешний узел, прежде чем пытаться удалить внутренний, так что вы можете получить исключение для пути, который не найден.

JsonPath вводит json-smart в качестве зависимости и использует его по умолчанию.Если вы хотите, чтобы он использовал Джексона, вы должны сказать это.например:

    Configuration conf = Configuration.builder()
            .jsonProvider(new JacksonJsonProvider())
            .mappingProvider(new JacksonMappingProvider())
            .options(Option.AS_PATH_LIST)
            .build();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...