尽管 TypeToken 不适合解析的字符串,Gson.fromJson 方法如何成功解析 Json 字符串?

How does Gson.fromJson method succeeded to parse a Json string although TypeToken isn't suit to parsed String?

我有一个代码,我不明白为什么它没有抛出 运行 时间异常。 这是一个 Json 字符串,我试图将其转换为 Mapbut 一些键 来自 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() 方法,看看它是如何完成的。