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

使用Gson fromJson转JSON到Java对象遇异常,如何解决?

Gson解析JSON触发MalformedJsonException的解决方法

问题重现

待解析的JSON结构:

{
  "title": "title",
  "product" : [
    {
      "key": "product1",
      "value": [{
        "valueName": "productValue1"
      }],
      "date" : "2022-10-11"
    },
    {
      "key": "product2",
      "value": [],
      "date" : "2022-10-11"
    }
  ]
}

对应的Java DTO类:

public class ProductDTO {
  String title;
  List<Product> product;
}

public class Product {
  String key;
  List<Value> value;
}

public class Value {
  String valueName;
}

转换代码:

// payload: String
Gson gson = new Gson();
ProductDTO productDTO = gson.fromJson(payload, ProductDTO.class);

执行时触发MalformedJsonException,注意到JSON中product2的value是空数组,但触发异常的核心原因是原JSON存在语法错误(如对象属性后缺少逗号、数组元素格式错误)。

解决步骤

1. 修复JSON的语法错误

MalformedJsonException本质是JSON格式不合法,必须先修正所有语法问题:

  • 确保对象中除最后一个属性外,其余属性后都添加逗号
  • 检查数组内元素的括号、引号是否配对闭合
  • 确认所有字符串值都被双引号包裹

修复后的合法JSON示例(需对照真实场景的语法问题调整):

{
  "title": "title",
  "product": [
    {
      "key": "product1",
      "value": [
        {
          "valueName": "productValue1"
        }
      ],
      "date": "2022-10-11"
    },
    {
      "key": "product2",
      "value": [],
      "date": "2022-10-11"
    }
  ]
}

2. 空数组的映射处理(语法修复后)

JSON语法合法后,Gson默认可以将空数组[]正常映射为List<Value>的空集合,无需额外处理。如果需要兼容更宽松的JSON格式,可配置Gson的宽松模式:

Gson gson = new GsonBuilder()
        .setLenient()
        .create();

另外,建议给DTO字段添加@SerializedName注解,确保JSON键名与Java字段名严格匹配(避免因大小写或命名差异导致的映射失败)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 18:05:26