Ответ 1
Может быть, ваш JsonElement
является JsonNull
Что вы можете сделать, это сначала проверить, что это не так, используя json.isJsonNull
В противном случае попытайтесь получить его строковое представление с помощью json.toString
Запуск игры! приложение с 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
Любая идея, почему он не работает на всех методах? Спасибо.
Может быть, ваш JsonElement
является JsonNull
Что вы можете сделать, это сначала проверить, что это не так, используя json.isJsonNull
В противном случае попытайтесь получить его строковое представление с помощью json.toString
У меня была аналогичная проблема, и мне пришлось сменить jsonObject.getAsString() на jsonObject.toString();
В моем случае мне просто нужно было получить элемент как пустую строку, если она равна нулю, поэтому я написал такую функцию:
private String getNullAsEmptyString(JsonElement jsonElement) {
return jsonElement.isJsonNull() ? "" : jsonElement.getAsString();
}
Итак, вместо
val geocoder = json.getAsString
Вы можете просто использовать этот
val geocoder = getNullAsEmptyString(json);
Он возвращает "", если элемент имеет значение null и фактическая строка, если она не является
Класс 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