java - 尽管 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方法运行的场景后面)?
解决方案
Gson 的方法是,来自 Java/Kotlin 端并尝试将 Json 值强制转换为 Java 端预期的类型。因此,由于您的地图键的类型是整数,它会尝试将其从 Json 获取的内容强制转换为整数。
您需要注意,您的整个 Json 最初只是 Gson 的一个字符串。它被标记化但仍然是一堆字符串,直到最后 Gson 看到你想要某个字符串作为整数。它很聪明,可以把2
和"2"
变成一个整数。
如果您的 json 有一个类似的键"foo"
,那么您会得到一个异常。
PS:如果你真的感兴趣,你可以使用调试器并进入 fromJson() 方法,看看它是如何完成的。
推荐阅读
- ansible - Ansible ImportError:无法导入名称“prepare_multipart”问题
- android - 创建 Hilt viewModel 时出错
- angular - 如何在剑道 listView Angular 中自动刷新数据
- c++ - VS Code 中的 C++,使用函数的非 const 参数在函数内声明数组时出现问题,虽然它应该是可能的
- javascript - 猫鼬中的最大数量验证
- go - 优先队列返回错误的顺序
- python - 有没有办法在保持比例的同时估算分类值?
- java - 根据用户决定在图形界面中执行的操作来执行某个 main。JAVA外汇
- java - 如何在 sdk 功能之外使用结构身份进行身份验证
- javascript - 添加 CSS 时自定义代码编辑器不起作用并中断