Удалите jsonnode, который содержит определенное слово

Я создал ниже 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"

    }
}
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
0
145
1

Ответы 1

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

Другие вопросы по теме