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

问题描述

我有一个我不明白为什么它没有抛出运行时异常的代码。这是我试图转换为 Map<String, Any>的Json字符串,其中一些键来自 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<Int,Any> 代码仍在编译中?又是一种拳击(在String.toInt方法运行的场景后面)?

标签: javaandroidjsonkotlingson

解决方案


Gson 的方法是,来自 Java/Kotlin 端并尝试将 Json 值强制转换为 Java 端预期的类型。因此,由于您的地图键的类型是整数,它会尝试将其从 Json 获取的内容强制转换为整数。

您需要注意,您的整个 Json 最初只是 Gson 的一个字符串。它被标记化但仍然是一堆字符串,直到最后 Gson 看到你想要某个字符串作为整数。它很聪明,可以把2"2"变成一个整数。

如果您的 json 有一个类似的键"foo",那么您会得到一个异常。

PS:如果你真的感兴趣,你可以使用调试器并进入 fromJson() 方法,看看它是如何完成的。


推荐阅读