Как получить значение по ключу на любом уровне документа JSON? - PullRequest
0 голосов
/ 02 октября 2018

Я пишу метод, который анализирует строку.Я знаю, что строка имеет формат json.

Также я знаю, что она содержит значения для lat и lng, но она может быть на любом уровне.

Я написал следующий код для реализацииполучение значения по ключу:

Map jsonBodyMap = objectMapper.convertValue(body, Map.class);
String lat = getByKey(jsonBodyMap, "lat");



private String getByKey(Map<?, ?> map, String key) {
    Object value = map.get(key);
    if (value != null) {
        return String.valueOf(value);
    }
    for (Map.Entry entry : map.entrySet()) {
        Object entryValue = entry.getValue();
        if (entryValue instanceof Map) {
            String val = getByKey((Map) entryValue, key);
           if (val != null) {
                return val;
            }
        }
    }
    return null;
}

Но это не выглядит хорошим решением.

Знаете ли вы лучший способ реализовать его?

1 Ответ

0 голосов
/ 02 октября 2018

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

private static String getByKey(Object obj, String key) {
    if(obj instanceof Map) {
        Map<?,?> map = (Map) obj;

        if(map.containsKey(key))
            return String.valueOf(map.get(key));

        return map.entrySet().stream()
                .map(a -> getByKey(a.getValue(), key))
                .filter(a -> a != null)
                .findAny()
                .orElse(null);

    }
    return null;
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...