Java常用JSON处理类库与Jackson

Jack

son 是 Java 事实标准 JSON 库,因 Spring 深度集成和模块化设计占主导;其 ObjectMapper 默认不支持 LocalDateTime,需添加 jackson-datatype-jsr310 并注册 JavaTimeModule;@JsonIgnore 忽略字段、@JsonProperty 指定双向字段名、@JsonAlias 仅兼容反序列化别名;解析泛型集合须用 TypeReference 或 JsonNode,避免 ClassCastException。

Jackson 是 Java 里事实标准的 JSON 处理库

它不是唯一选择,但绝大多数 Spring Boot 项目、微服务接口、配置解析场景默认用的就是 Jackson。Gson 和 Fastjson 曾有各自优势,但现在除遗留系统外,新项目基本不推荐主动切换——Jackson 的模块化设计、注解丰富度、流式 API 和 Spring 深度集成能力,已形成明显代差。

为什么 ObjectMapper 默认不支持 LocalDateTime?

因为 ObjectMapper 原生只认 JDK 8 之前的 DateCalendar,而 LocalDateTime 等新时间类型需要显式注册序列化/反序列化器。不配就报错:Cannot construct instance of java.time.LocalDateTime

  • 最简修复:添加 jackson-datatype-jsr310 依赖,并注册模块
  • Spring Boot 2.2+ 可直接在 application.yml 加配置:
    spring:
      jackson:
        date-format: yyyy-MM-dd HH:mm:ss
        serialization:
          write-dates-as-timestamps: false
  • 手动注册示例:
    ObjectMapper mapper = new ObjectMapper();
    mapper.registerModule(new JavaTimeModule());

@JsonIgnore、@JsonProperty 和 @JsonAlias 怎么选?

三者解决不同问题,混用容易出错:

  • @JsonIgnore:彻底忽略字段(序列化 + 反序列化都不处理),适合敏感字段或临时冗余字段
  • @JsonProperty("user_name"):指定 JSON 字段名,**双向生效**;常用于下划线转驼峰
  • @JsonAlias({"userName", "user_name"}):仅作用于反序列化,允许多个别名兼容老接口,但输出仍按字段名或 @JsonProperty 定义

注意:@JsonProperty 如果只写在 getter 上,setter 不匹配别名会导致反序列化失败;建议统一加在字段上。

JSON 字符串转 List> 为什么总报 ClassCastException?

常见写法:

ObjectMapper mapper = new ObjectMapper();
List> list = mapper.readValue(json, List.class);
这样得到的是 List,不是 List,强转会崩。

  • 正确写法必须用 TypeReference
    List> list = mapper.readValue(json, new TypeReference>>() {});
  • 泛型擦除是根本原因,List.class 在运行时无法还原嵌套泛型信息
  • 如果只是临时解析,用 JsonNode 更安全:
    JsonNode root = mapper.readTree(json);
    for (JsonNode node : root) {
        String name = node.path("name").asText();
    }

这个坑几乎每个用 Jackson 解析动态结构的人早期都踩过,记住:只要带泛型,就得用 TypeReferenceJsonNode