【发布时间】:2020-11-16 16:15:05
【问题描述】:
我有一段代码我不明白为什么它没有抛出运行时异常。
这是一个 Json 字符串,我正在尝试将其转换为 Map
val json = """{1: "Kotlin Tutorial", "2": "bezkoder", "3" : ["Kotlin","Basic"]}"""
val gson = Gson()
var tutorialMap: Map<Int, Any> = gson.fromJson(json, object : TypeToken<Map<Int, Any>>() {}.type)
tutorialMap.forEach { Log.e("dadffas",it.toString()) }
如您所见,keys: 1,3 来自 Int 类型。这里发生了什么?某种拳击?
此外,如果我将 TypeToken 声明为 Map
【问题讨论】:
-
1) JSON 既不支持 int 也不支持 numeric 键:有效的 JSON 文档只能包含字符串键、句点。 2) Gson 对格式错误的 JSON 文档非常宽容,并允许读取数字键,就好像它们是字符串一样。 github.com/google/gson/blob/…
-
@fluffy,我进入链接但不明白那里发生了什么 :( 另外我写道:* 此外,如果我将 TypeToken 声明为 Map
代码仍然正在编译?又是一种拳击(在 String.toInt 方法正在运行的场景后面)?* 是真的吗? -
它被编译是因为你使用的
fromJson方法重载接受Type的实例,而不是TypeToken,它可以从以下位置推断结果类型:两者left 类型和 right 类型在这种情况下是不相关的。这不是一种“拳击”(我相信幕后没有像String.toInt这样的东西,因为对象属性名称总是被读取为字符串,即使它们看起来像数字)。 -
因此,
it.key.javaClass将始终返回java.lang.String。它在运行时不会失败的原因是您没有将密钥取消引用为Int,这会在运行时引发类转换异常。 -
我已编辑帖子(更改 tutorialMap 变量类型)。您说 it.key.javaClass 将始终返回 java.lang.String 但以下分配有效: var vv: Class
= it.key.javaClass 和 var vv: Class = it.key.javaClass 无效
标签: java android json kotlin gson