You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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()
}

额外排查步骤

  1. 打印payload的原始内容,确认它是未被引号包裹的纯JSON字符串,比如直接是{"123": {...}}而不是转义后的"{\"123\": {...}}"
  2. 校验payload的语法合法性,确保没有多余符号、缺失逗号等问题

内容的提问来源于stack exchange,提问作者GabrielDragone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 03:05:41