首页 > 解决方案 > Kotlin Elvis Operator 在 JsonElement 上失败?

问题描述

我有这个我试图解析的 gson JsonElement。此 json 元素的某些属性可能不存在,因此我尝试使用 Elvis 运算符来提供默认值(空字符串),以防 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 ?: ""

错误发生在最后一行。根据我对 Elvis Operator 的理解, if valueis nullthenvar valueString = value?.asString ?: ""应该简单地设置valueString为空字符串。相反,正在发生的是抛出异常。

这不是 Elvis 运算符的正确实现吗?我有点困惑为什么它失败了。

标签: androidkotlinnulloperators

解决方案


查看 Gson 的源代码,您的 Json 中的 null 值表示为 JsonNull 对象,而不是nullJava 或 Kotlin 中的实际值。

JsonNull 不支持调用asString它。它将抛出 UnsupportedOperationException。

所以你value很可能不是null,而是 JsonNull 的一个实例。所以value?.asString调用JsonNull.getAsString(),它会抛出 UnsupportedOperationException。


推荐阅读