Jackson解析JSON的核心方法只有readValue()和readTree(),不存在parse();字段名不匹配需用@JsonProperty或全局配置SNAKE_CASE;类型错配常见于无参构造函数缺失或Lombok未加@NoArgsConstructor;ObjectMapper应复用而非频繁新建。

ObjectMapper.parse() 不存在,别被IDE自动补全骗了
Java里用Jackson解析JSON,最常踩的坑是以为有 ObjectMapper.parse() 或 parseJson() 这种方法——它真没有。ObjectMapper 的核心入口只有两个: readValue() 和 readTree(),其他都是变体或封装。
常见错误现象:Cannot resolve method 'parse(...)' ;或者 IDE 提示后点了就报编译失败。
-
readValue(String, Class):直接反序列化成具体 Java 类(如User.class),最常用 -
readValue(String, TypeReference):用于泛型集合,比如List<Map<String, Object>> -
readTree(String):返回JsonNode,适合结构不确定、需动态读取字段的场景
反序列化时字段名对不上?检查@JsonProperty和@JsonIgnore
JSON 字段是 user_name,Java 字段叫 userName,默认情况下 ObjectMapper 不会自动匹配——它严格按字段名(或 getter/setter 名)映射,除非你告诉它怎么映射。
使用场景:对接外部API、遗留系统返回下划线命名 JSON、或想忽略某些字段。
立即学习“Java免费学习笔记(深入)”;
- 加
@JsonProperty("user_name")在字段或 setter 上,强制指定 JSON 键名 - 加
@JsonIgnore在不想参与序列化的字段上(比如临时计算字段) - 全局配置更省事:
mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE),但只对标准 getter/setter 生效,不适用于 private 字段直写
遇到 com.fasterxml.jackson.databind.exc.MismatchedInputException?大概率是类型错配
典型错误信息:MismatchedInputException: Cannot construct instance of `X` (although at least one Creator exists)。这不是语法错,而是 Jackson 找不到合适的构造方式或字段能接收数据。
原因往往不是 JSON 格式错,而是 Java 类定义和 JSON 结构不一致:
- JSON 是对象,但你传了
String.class给readValue() - 目标类没有无参构造函数,且没用
@JsonCreator标注合适构造器或静态工厂方法 - 字段是
final但没提供 setter 或构造参数绑定(Jackson 2.12+ 支持 record,但老版本仍需显式配置) - 用了 Lombok 的
@Data却忘了@NoArgsConstructor,导致反序列化失败
性能敏感?别每次 new ObjectMapper,也别乱开 DeserializationFeature
ObjectMapper 是线程安全的,可以复用;但很多人习惯在方法里 new ObjectMapper(),这会触发大量反射初始化,拖慢吞吐量。
同时,有些开关看着“更健壮”,实则代价不小:
- 开启
DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY会让 Jackson 多做一次类型推断,小数据不明显,高并发下可观测到 CPU 上升 -
DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES = false看似省心,但掩盖了字段名变更问题,上线后可能静默丢数据 - 建议:全局单例 + 按需配置
configure(DeserializationFeature..., true/false),避免每个请求都重建实例
复杂点在于:不同业务模块可能需要不同配置(比如一个要宽松时间格式,一个要严格校验),这时得用 copy() 创建子实例,而不是反复 new。










