如何使用Gson反序列化Map<Int, Map<String, String>>类型JSON?
解决Gson反序列化Map<Int, Map<String, String>>的问题
先修正JSON语法错误
你提供的JSON存在两处语法问题,会直接导致解析失败,修正后如下:
{ "123": { "KEY_ONE": "blablabla", "KEY_TWO": "blablabla" }, "456": { "KEY_ONE": "blablabla", "KEY_TWO": "blablabla" } }
- 去掉第一个子对象中
KEY_TWO后面多余的逗号 - 补上第二个子对象中
KEY_ONE后面缺失的逗号
报错原因解析
你遇到的java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING错误,核心问题是传入的payload不符合要求:
- 要么
payload是被双引号包裹的字符串(比如"{...}"),Gson会把它当成普通字符串而非JSON对象解析 - 要么
payload为空、格式损坏,无法被识别为合法的JSON对象
另外你的第二种尝试存在变量名错误:把定义好的type写成了type::class.java,这也会导致解析失败。
正确的反序列化写法
方式一:使用TypeToken指定泛型类型
这是Gson处理泛型集合的标准写法:
val gson = Gson() // 声明目标泛型类型 val targetType = object : TypeToken<Map<Int, Map<String, String>>>() {}.type try { val result: Map<Int, Map<String, String>> = gson.fromJson(payload, targetType) // 这里处理解析后的Map数据 } catch (e: JsonSyntaxException) { // 捕获语法错误,检查payload格式 e.printStackTrace() }
方式二:使用Gson Kotlin扩展(更简洁)
如果引入Gson的Kotlin扩展依赖(com.google.code.gson:gson-kotlin-extensions),可以省去TypeToken的声明:
val gson = Gson() try { val result: Map<Int, Map<String, String>> = gson.fromJson(payload) // 处理解析结果 } catch (e: JsonSyntaxException) { e.printStackTrace() }
额外排查步骤
- 打印
payload的原始内容,确认它是未被引号包裹的纯JSON字符串,比如直接是{"123": {...}}而不是转义后的"{\"123\": {...}}" - 校验
payload的语法合法性,确保没有多余符号、缺失逗号等问题
内容的提问来源于stack exchange,提问作者GabrielDragone
相关产品推荐
相关产品推荐

