Разбор вложенной структуры json с использованием пакета gson - PullRequest
0 голосов
/ 05 января 2019

На декодирование структуры JSON в Java уже дан ответ, и я использовал ее для нескольких простых структур, но это кажется немного сложным. (Я не тратил слишком много времени на разработку Java-кода, поэтому я могу упустить кое-что специфическое для языка здесь, и я тоже могу ошибаться в этом)

{
    "who": "123",
    "mapping": {
        "element1": {
            "element11": {
                "relation": "rel1",
                "direction_p2c": true,
                "element111": {
                    "relation": "rel2",
                    "direction_p2c": true,
                    "element1111": {
                        "relation": "rel1",
                        "direction_p2c": false
                    },
                    "element1112": {
                        "relation": "rel1",
                        "direction_p2c": false
                    },
                    "element1113": {
                        "relation": "rel1",
                        "direction_p2c": false
                    }
                },
                "element112": {
                    "relation": "rel3",
                    "direction_p2c": false
                }
            },
            "element12": {
                "relation": "rel1",
                "direction_p2c": true,
                "element121": {
                    "relation": "rel2",
                    "direction_p2c": true,
                    "element1211": {
                        "relation": "rel1",
                        "direction_p2c": false
                    }
                }
            }
        },
        "element2": {
            "element21": {
                "relation": "rel2",
                "direction_p2c": true
            },
            "element22": {
                "relation": "rel3",
                "direction_p2c": true
            },
            "element23": {
                "relation": "rel1",
                "direction_p2c": true
            }
        }
    }
}

Выше упомянутая структура, и я использую Gson для декодирования, ниже то, что я пытаюсь,

void recursive(String key, HashMap<String, Object> value) {
    for (Map.Entry<String, Object> entry: value.entrySet()) {
        recurssive(entry.getKey(), (HashMap<String, Object>) entry.getValue());
    }
}

HashMap<String, Object> decodedJson = new Gson().fromJson(inputJson, HashMap.class);
recursive("mapping", (HashMap<String, Object>) decodedJson.get("mapping"));

И я получаю приведенную ниже ошибку во время выполнения при первом recursive вызове функции

javax.servlet.ServletException: java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to java.util.HashMap

Мне еще предстоит попробовать это способом, определенным в Анализировать вложенный JSON с помощью gson с использованием JsonParser, но любой вход в декодирование приветствуется.

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Gson класс LinkedTreeMap расширяет AbstractHashMap, который внутренне реализует Map интерфейс.
Gson использует LinkedTreeMap вместо HashMap. Поскольку вы приводите объект к HashMap, что не может быть сделано (поскольку он отсутствует в иерархии), следовательно, ClassCastException
Как упомянул @Karol, замените HashMap на Map, и все должно работать нормально.

0 голосов
/ 05 января 2019

Замените класс java.util.HashMap на интерфейс java.util.Map. Он реализован Gson's LinkedTreeMap, поэтому не будет запускать ClassCastException.

void recursive(String key, Map<String, Object> value) {
  ...
}

Map<String, Object> decodedJson = new Gson().fromJson(inputJson, Map.class);
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...