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

Android Gson解析含空格的JSON时报MalformedJsonException错误如何解决

问题根因

你遇到的报错本质不是phrase字段中的空格导致的,核心问题如下:

  • 你传入gson.fromJson的JSON串本身不合法:data.game.toString()的调用存在问题,如果data.game本身是org.json.JSONObject类型,部分Android系统版本的JSONObject无参toString()实现会对带特殊符号、空格的字符串值做错误处理,甚至意外截断字符串两端的双引号,最终生成的字符串不符合JSON格式规范,触发Gson格式校验报错。你移除空格后解析正常只是巧合,本质是修改后的内容刚好避开了JSONObject.toString()的处理缺陷。
  • 你的模型类存在隐藏风险:SmilingPointsModel中声明的time: Long字段在你提供的JSON示例中不存在,如果后端返回也没有该字段,会额外触发解析失败。
解决方案

按优先级依次执行以下操作即可解决:

  1. 替换错误的JSON获取方式
    不要通过JSONObject.toString()的方式生成待解析的JSON串,优先使用后端返回的原始JSON字符串传入Gson解析。如果只能从JSONObject获取值,调用带缩进参数的toString方法输出合法JSON:
val validJsonStr = data.game.toString(0) // 0代表无缩进输出标准格式JSON
model = gson.fromJson(validJsonStr, SmilingPointsModel::class.java)

如果是本地硬编码测试JSON,使用Kotlin三重引号包裹字符串避免转义问题:

val testJson = """
{
    "_id": {"\$oid": "6108da994d809314a59829de"},
    "level": 1,
    "type": "smiling_points",
    "category": "pro",
    "sequence": [
        {"phrase": "1","isPhrase": false,"showNumber": true},
        {"phrase": "2","isPhrase": false,"showNumber": false},
        {"phrase": "( 19 + 21 ) / 4 = 10","isPhrase": false,"showNumber": true}
    ]
}
""".trimIndent()
  1. 开启Gson宽松解析模式
    如果确认输入JSON本身合法,可开启宽松解析适配非标准格式的JSON:
val gson = GsonBuilder()
    .disableHtmlEscaping()
    .setLenient() // 开启宽松解析,降低格式校验强度
    .create()
  1. 修正模型类可选字段
    将不存在/可能不返回的字段改为可空类型,避免空值解析失败:
@Keep
data class SmilingPointsModel(
    val _id: OID,
    val level: Int,
    val type: String,
    val category: String,
    val time: Long? = null, // 改为可空类型,缺失时默认赋值为null
    val sequence: ArrayList<SmilingPointsModelItem>
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:36:03