使用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
相关产品推荐
相关产品推荐

