Jackson 默认遇到未知字段会抛出 UnrecognizedPropertyException;可通过全局/局部配置 FAIL_ON_UNKNOWN_PROPERTIES=false 或 @JsonIgnoreProperties(ignoreUnknown = true) 实现静默跳过,而 @JsonAnySetter 用于主动捕获未知字段。

Jackson 默认遇到 JSON 中存在 Java 对象没有对应字段的属性时,会抛出 UnrecognizedPropertyException。要让反序列化跳过未知字段、不报错,核心是配置 ObjectMapper 的反序列化行为。
启用 IGNORE_UNKNOWN_PROPERTIES
这是最常用且直接的方式:告诉 Jackson 忽略所有目标类中不存在的 JSON 字段。
- 全局配置(推荐用于统一处理):
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
- 局部配置(仅对某次反序列化生效):
.with(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
MyClass obj = reader.readValue(jsonString);
用 @JsonIgnoreProperties 注解控制单个类
适用于只想对特定类关闭未知字段检查,不影响其他类型。
- 在类上添加注解即可:
public class MyClass {
private String name;
// getter/setter
}
- 也可指定忽略某些已知字段(非未知字段),但此处只需
ignoreUnknown = true
注意与 @JsonAnySetter 的区别
@JsonAnySetter 不是用来“避免报错”的兜底方案,而是主动捕获未知字段并存入 Map 或做自定义处理。
立即学习“Java免费学习笔记(深入)”;
- 适合需要记录、审计或转发未知字段的场景
- 若只求静默跳过,无需额外逻辑,用前两种方式更轻量
- 示例:
private String name;
private Map<String, Object> extra = new HashMap<>();
@JsonAnySetter
public void setExtra(String key, Object value) {
extra.put(key, value);
}
}
常见陷阱提醒
即使设置了 FAIL_ON_UNKNOWN_PROPERTIES = false,仍可能报错的情况:
- JSON 格式错误(如逗号缺失、引号不匹配)→ 属于解析错误,和未知字段无关
- 目标字段类型不匹配(如 JSON 给了字符串,Java 字段是 int)→ 会触发类型转换异常,需配合
DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT等辅助配置 - 使用了
@JsonProperty(required = true)但 JSON 缺少该字段 → 报错与未知字段无关,而是必填字段缺失


















