尽管 TypeToken 不适合解析的字符串,Gson.fromJson 方法如何成功解析 Json 字符串?
How does Gson.fromJson method succeeded to parse a Json string although TypeToken isn't suit to parsed String?
我有一个代码,我不明白为什么它没有抛出 运行 时间异常。
这是一个 Json 字符串,我试图将其转换为 Map,but 一些键 来自 Int 类型而不是 String。
代码:
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()) }
如您所见,键:1,3 来自 Int 类型。这里发生了什么?某种拳击?
此外,如果我将 TypeToken 声明为 Map 代码仍在编译中?再来个拳法(幕后String.toInt方法是运行ning)?
Gson 的方法是,从 Java/Kotlin 端尝试将 Json 值强制转换为 Java 端预期的类型。
因此,由于地图键的类型是 Integer,它会尝试将其从 Json 获得的内容强制转换为 Integer.
您需要注意,您的整个 Json 最初只是 Gson 的一个字符串。它被标记化但仍然是一堆字符串,直到最后 Gson 看到您想要某个字符串作为整数。它足够聪明,可以将 2
和 "2"
转换为整数。
如果您的 json 有一个像 "foo"
这样的键,您会得到一个例外。
P.S:如果您真的有兴趣,可以使用调试器并进入 fromJson() 方法,看看它是如何完成的。
我有一个代码,我不明白为什么它没有抛出 运行 时间异常。
这是一个 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()) }
如您所见,键:1,3 来自 Int 类型。这里发生了什么?某种拳击?
此外,如果我将 TypeToken 声明为 Map
Gson 的方法是,从 Java/Kotlin 端尝试将 Json 值强制转换为 Java 端预期的类型。 因此,由于地图键的类型是 Integer,它会尝试将其从 Json 获得的内容强制转换为 Integer.
您需要注意,您的整个 Json 最初只是 Gson 的一个字符串。它被标记化但仍然是一堆字符串,直到最后 Gson 看到您想要某个字符串作为整数。它足够聪明,可以将 2
和 "2"
转换为整数。
如果您的 json 有一个像 "foo"
这样的键,您会得到一个例外。
P.S:如果您真的有兴趣,可以使用调试器并进入 fromJson() 方法,看看它是如何完成的。