Подтвердить что ты не робот

GSON JsonObject "Неподдерживаемая операция Исключение: null" getAsString

Запуск игры! приложение с Scala. Я делаю запрос, где ожидается, что ответ будет строкой JSON. При проверке отладчика JsonElement возвращает OK со всей информацией, как ожидалось. Однако проблема заключается в том, что я пытаюсь фактически запускать методы в этом JsonElement.

val json = WS.url("http://maps.googleapis.com/maps/api/geocode/json?callback=?&sensor=true&address=%s", startAddress+","+startCity+","+startProvince).get.getJson
    val geocoder = json.getAsString

Единственная ошибка, которую я получаю, - это Unsupported Operation Exception: null, и я пробовал это на getAsString и getAsJsonObject и getAsJsonPrimitive

Любая идея, почему он не работает на всех методах? Спасибо.

4b9b3361

Ответ 1

Может быть, ваш JsonElement является JsonNull

Что вы можете сделать, это сначала проверить, что это не так, используя json.isJsonNull

В противном случае попытайтесь получить его строковое представление с помощью json.toString

Ответ 2

У меня была аналогичная проблема, и мне пришлось сменить jsonObject.getAsString() на jsonObject.toString();

Ответ 3

В моем случае мне просто нужно было получить элемент как пустую строку, если она равна нулю, поэтому я написал такую ​​функцию:

private String getNullAsEmptyString(JsonElement jsonElement) {
        return jsonElement.isJsonNull() ? "" : jsonElement.getAsString();
    }

Итак, вместо

val geocoder = json.getAsString

Вы можете просто использовать этот

val geocoder = getNullAsEmptyString(json);

Он возвращает "", если элемент имеет значение null и фактическая строка, если она не является

Ответ 4

Класс JsonElement выбрасывает Unsupported Operation Exception для любого метода getAs<Type>, потому что он абстрактный класс и имеет смысл, что он реализован таким образом.

По какой-то причине класс JsonObject не реализует методы getAs<Type>, поэтому любой вызов одного из этих методов вызовет исключение.

Вызов метода toString для объекта JsonElement может решить вашу проблему в определенных обстоятельствах, но, возможно, это не то, что вам нужно, поскольку в некоторых случаях он возвращает представление json в виде String (например, \"value\").

Я обнаружил, что существует также класс JsonPrimitive и он реализует методы getAs<Type>. Поэтому, вероятно, правильный путь - что-то вроде этого:

    String input = "{\"key1\":\"value1\",\"key2\":\"value2\"}";
    JsonParser parser = new JsonParser();
    JsonElement jsonTree = parser.parse(input);

    if(jsonTree != null && jsonTree.isJsonObject()) {
        JsonObject jsonObject = jsonTree.getAsJsonObject();
        value = jsonObject.get("key1").getAsJsonPrimitive().getAsString()
    }

PS. Я удалил всю часть Numlability MGMT. Если вы пишете код на Java, вы, вероятно, захотите справиться с этим лучше.

см. исходный код GitHub для JsonElement:https://github.com/google/gson/blob/master/gson/src/main/java/com/google/gson/JsonElement.java#L178