Kotlin Ошибка оператора Элвиса на JsonElement? - PullRequest
1 голос
/ 11 марта 2020

У меня есть этот gson JsonElement, который я пытаюсь разобрать. Возможно, что некоторые атрибуты этого элемента json не существуют, поэтому я пытаюсь использовать оператор Элвиса для предоставления значения по умолчанию (пустая строка) в случае, если части элемента json не существуют. Вот элемент json, который доставляет мне неприятности:

{"und":[{"value":null,"format":null,"safe_value":""}]}

Я пытаюсь извлечь из этого значения значение в виде строки. Если он нулевой, то я хочу установить по умолчанию пустую строку.

Вот как я это делаю ( примечание: этот json элемент называется phone):

val tempPhone = phone?.asJsonObject?.get("und")?.asJsonArray?.get(0)?.asJsonObject?.get("value")?.asString ?: ""

Я разбил это шаг за шагом для отладки, и вот что показывает мой отладчик ( примечание: отладчик входит в систему ()):

var undArr = phone?.asJsonObject?.get("und")?.asJsonArray   debug: (undArr: "[{"value":null,"format":null,"safe_value":""}]")
var undObj = undArr?.get(0)?.asJsonObject   debug: (undObj: "{"value":null,"format":null,"safe_value":""}")
var value = undVal?.get("value").   debug: (value: "null")
var valueString = value?.asString ?: ""

Ошибка происходит в последней строке. Из моего понимания оператора Элвиса, если value равно null, то var valueString = value?.asString ?: "" должен просто установить valueString в пустую строку. Вместо этого происходит исключение.

Разве это не правильная реализация оператора Элвиса? Я немного озадачен, почему это не получается.

1 Ответ

2 голосов
/ 11 марта 2020

Глядя на исходный код Gson, нулевое значение в вашем Json представляется как объект JsonNull, а не фактическое значение null в Java или Kotlin.

JsonNull не поддерживает звоню asString на это. Он выдаст исключение UnsupportedOperationException.

Так что ваш value скорее всего не null, а скорее экземпляр JsonNull. Так value?.asString вызывает JsonNull.getAsString(), что вызывает исключение UnsupportedOperationException.

...