Java解析JSON异常需先定位类型再处理:JsonParseException是语法错误,JsonMappingException是结构不匹配,JsonProcessingException是泛型或构造问题,JSONException多因控制字符;应优先验证数据格式、检查标点与空白、调整Jackson配置或优化类映射。

Java解析JSON报异常,核心是定位错误类型再针对性处理。不是所有异常都要改代码,有些只需校验数据或微调配置。
先看报的是哪种异常
不同异常对应不同根因,别一上来就重写解析逻辑:
- JsonParseException:纯语法问题,比如字段没加双引号、多了一个逗号、用了中文冒号或引号
-
JsonMappingException:结构对不上,比如JSON里是
"user_name",Java类里却叫userName;或字段为null但属性声明为int - JsonProcessingException(父类):涵盖前两者,也可能是序列化/反序列化过程中的泛型、构造函数缺失等问题
-
JSONException(json-lib等老库):常见于含换行符
\n、制表符\t或未转义的控制字符
快速验证和修复JSON格式
别靠肉眼找错,用工具+基础检查:
- 把原始JSON粘贴到json.cn或JSONLint验证是否合法
- 检查是否有中文标点(如“:”“,”“””)、全角空格、不可见控制字符(可用IDE的“显示所有字符”功能)
- 如果JSON来自前端或日志,打印时加
System.out.println(jsonString.replace("\n", "\\n").replace("\r", "\\r")),看清真实换行和空白 - 对含用户输入的字段(如备注、描述),预处理再解析:
jsonString = jsonString.replaceAll("[\\p{Cntrl}&&[^\r\n\t]]", "")
调整Jackson配置降低敏感度
适用于调试或兼容老旧数据源,不建议长期用于生产环境:
立即学习“Java免费学习笔记(深入)”;
- 允许无引号字段名:
mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true) - 允许末尾逗号:
mapper.configure(JsonParser.Feature.ALLOW_TRAILING_COMMA, true) - 忽略未知字段(防
Unrecognized field):mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) - 容忍null值赋给基本类型(如
int):mapper.configure(DeserializationFeature.ACCEPT_NULL_AS_EMPTY_ARRAY, true)或改用包装类(Integer)
规范Java类定义和映射
让代码主动适配数据,而不是反过来硬扛:
- 字段名不一致?加
@JsonProperty("api_user_name")注解 - 某些字段可能为空?属性用包装类型(
String、Integer),或设默认值:private int status = 0; - 不想序列化null字段?类上加
@JsonInclude(JsonInclude.Include.NON_NULL) - 需要忽略整个字段?加
@JsonIgnore;忽略未知字段更稳妥?类上加@JsonIgnoreProperties(ignoreUnknown = true)
基本上就这些。多数情况是JSON格式不严或映射松散导致,先验证数据、再看异常类型、最后选配置或改模型——顺序错了容易绕弯子。










