我有一个代码,我不明白为什么它没有抛出运行时异常。这里是一个json字符串,我正试图将其转换为map<string,any>,但是有些键来自int类型,而不是字符串。代码:
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,那么是否还有>代码仍在编译?又是一种拳击(幕后string.toint方法正在运行)?
1条答案
按热度按时间snvhrwxg1#
gson的方法是,来自java/kotlin端,并尝试将json值强制为java端所期望的类型。因此,由于Map的键的类型是integer,它会尝试将从json获得的内容强制转换为integer。
您需要知道,整个json最初只是gson的一个字符串。它被标记化,但仍然是一堆字符串,直到最后gson看到您希望某个字符串是整数。它足够聪明
2
以及"2"
转换为整数。如果你的json有一个
"foo"
,你会得到一个例外。p、 s:如果你真的感兴趣,你可以使用调试器,进入fromjson()方法,看看它是如何完成的。