Kotlin Elvis 运算符在 JsonElement 上失败?

Kotlin Elvis Operator failing on JsonElement?

我正在尝试解析这个 gson JsonElement。此 json 元素的某些属性可能不存在,因此我尝试使用 Elvis 运算符在 json 元素的某些部分不存在的情况下提供默认值(空字符串)存在。这是给我带来麻烦的 json 元素:

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

我想做的是从中提取 '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 ?: ""

错误发生在最后一行。根据我对猫王运算符的理解,如果 valuenull 那么 var valueString = value?.asString ?: "" 应该简单地将 valueString 设置为一个空字符串。相反,发生的是抛出异常。

这不是 Elvis 运算符的正确实现吗?我对它失败的原因感到有些困惑。

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

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

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