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 ?: ""
错误发生在最后一行。根据我对猫王运算符的理解,如果 value
是 null
那么 var valueString = value?.asString ?: ""
应该简单地将 valueString
设置为一个空字符串。相反,发生的是抛出异常。
这不是 Elvis 运算符的正确实现吗?我对它失败的原因感到有些困惑。
查看 Gson 的源代码,Json 中的空值表示为 JsonNull 对象,而不是 Java 或 Kotlin 中的实际 null
值.
JsonNull 不支持对其调用 asString
。它将抛出 UnsupportedOperationException。
所以您的 value
很可能不是 null
,而是 JsonNull 的实例。所以 value?.asString
调用 JsonNull.getAsString()
,它抛出 UnsupportedOperationException。
我正在尝试解析这个 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 ?: ""
错误发生在最后一行。根据我对猫王运算符的理解,如果 value
是 null
那么 var valueString = value?.asString ?: ""
应该简单地将 valueString
设置为一个空字符串。相反,发生的是抛出异常。
这不是 Elvis 运算符的正确实现吗?我对它失败的原因感到有些困惑。
查看 Gson 的源代码,Json 中的空值表示为 JsonNull 对象,而不是 Java 或 Kotlin 中的实际 null
值.
JsonNull 不支持对其调用 asString
。它将抛出 UnsupportedOperationException。
所以您的 value
很可能不是 null
,而是 JsonNull 的实例。所以 value?.asString
调用 JsonNull.getAsString()
,它抛出 UnsupportedOperationException。