Java - рекурсивно удалять поля из строки JSON без POJO - PullRequest
0 голосов
/ 09 ноября 2018

Как мне рекурсивно удалить некоторые поля с указанным именем из строки JSON?

Например, я хочу удалить поле "secondName" из следующего JSON:

ВХОД:

{
    "name" : "abc",
    "secondName": "qwe",
    "add" : "abcd",
    "moreDetails" : {
        "secondName": "qwe",
        "age" : "099"
    }
}

ВЫВОД:

{
    "name" : "abc",
    "add" : "abcd",
    "moreDetails" : {
        "age" : "099"
    }
}

Мне нужно удалить некоторые поля из множества разных JSON с разными структурами / схемами, поэтому я не смогу десериализовать / сериализовать в / из POJO.

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018

Вы можете сделать, как показано ниже, если вы знаете схему и иерархию:

JsonObject jsonObj= gson.fromJson(json, JsonObject.class); jsonObj.getAsJsonObject("moreDetails").remove("secondName"); System.out.println(jsonObj.getAsString());

см. Эту информацию для получения дополнительной информации Удалить ключ из Json внутри JsonObject

иначе вам нужно написать динамическую функцию, которая проверит каждый элемент объекта JSON и попытается найти в нем элемент secondName и удалить его.

Итак, рассмотрим здесь, поскольку у вас есть несколько вложенных объектов, вам нужно написать функцию, которая будет выполнять итерацию по каждому элементу, и проверять его тип, если он снова jsonObject вызывает один и тот же метод рекурсивно или итеративно для проверки текущего элемента в каждой проверке. вам также необходимо убедиться, что ключ, если он совпадает с ключом, который должен быть удален, вы можете удалить его и продолжить то же самое.

Чтобы узнать, как проверить тип значения JSON, см. Как проверить тип значения из JSONObject?

0 голосов
/ 09 ноября 2018

Gson десериализует любой допустимый Json до LinkedTreeMap, например:

LinkedTreeMap<?,?> ltm = new Gson().fromJson(YOUR_JSON, LinkedTreeMap.class);

Затем речь идет о создании некоторых рекурсивных методов для очистки:

public void alterEntry(Entry<?, ?> e) {
    if(e.getValue() instanceof Map) {
        alterMap((Map<?, ?>) e.getValue());
    } else {
        if(e.getKey().equals("secondName")) { // hard coded but you see the point 
            e.setValue(null); // we could remove the whole entry from the map
                              // but it makes thing more complicated. Setting null
                              // achieves the same.
        }
    }
}

public void alterMap(Map<?,?> map) {
    map.entrySet().forEach(this::alterEntry);
}

Использование:

alterMap(ltm);
0 голосов
/ 09 ноября 2018

Вы можете попробовать сохранить JSON как JSONObject, перебрать ключи с помощью jsonObject.names() и удалить записи с помощью jsonObject.remove(key).

...