android - 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 value
is null
thenvar valueString = value?.asString ?: ""
应该简单地设置valueString
为空字符串。相反,正在发生的是抛出异常。
这不是 Elvis 运算符的正确实现吗?我有点困惑为什么它失败了。
解决方案
查看 Gson 的源代码,您的 Json 中的 null 值表示为 JsonNull 对象,而不是null
Java 或 Kotlin 中的实际值。
JsonNull 不支持调用asString
它。它将抛出 UnsupportedOperationException。
所以你value
很可能不是null
,而是 JsonNull 的一个实例。所以value?.asString
调用JsonNull.getAsString()
,它会抛出 UnsupportedOperationException。
推荐阅读
- python - 为什么程序执行时间和以前一样?
- java - 使用 ThriftData 以 Avro 格式序列化 Thrift 数据时发生 ClassCastException
- reactjs - ReactJS 上的 HTTPS 和服务
- android - 无法将图像上传到 firebase 说:发生未知错误,请检查 HTTP 结果代码和服务器响应的内部异常
- python - 如何为flask注册自定义的http状态码?
- csv - 将特定的 Excel 工作表另存为 .csv
- c# - 如何修复`您的项目未引用“.NETFramework,Version=v4.6.1”框架...`
- python - 使用 Selenium 从戴尔网站抓取笔记本电脑信息
- mysql - 删除除最后 10 行之外的所有行?或者最大行数= 10?
- r - 找到每个日期的最大速度的有效方法