首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Jackson JSON 處理完整指南:序列化、反序列化、日期格式與樹模型解析

     編輯:Java 相關知識

為什麼選擇 Jackson?

  • 性能優異:序列化/反序列化速度領先 Gson、Json-lib 10 倍以上
  • 功能全面:支持流式 API、樹模型、數據綁定三種解析方式
  • 社區活躍:持續維護、版本迭代快、Spring Boot 默認 JSON 庫
  • 擴展性強:模塊化架構、支持自定義序列化器、註解驅動

核心類:ObjectMapper

Jackson 核心入口,線程安全,可復用單例:

ObjectMapper mapper = new ObjectMapper();
// 常用配置
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

序列化(Java → JSON)

1. 基礎類型與集合

List list = Arrays.asList(1, 2, 3);
String json = mapper.writeValueAsString(list);
// 輸出: [1,2,3]

2. 自定義對象(POJO)

public class Student {
    private int age = 10;
    private String name = "hhh";
    private String[] list = {"hao", "haouhao", "keyi"};
    private Date time = new Date();
    // Getter/Setter...
}

Student st = new Student();
String json = mapper.writeValueAsString(st);
// 輸出: {"list":["hao","haouhao","keyi"],"time":1375429228382,"name":"hhh","age":10}

3. 日期格式自定義

// 方式一:全局配置 ISO-8601
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
// 輸出: "time":"2013-08-02T03:48:20.000+0000"

// 方式二:自定義格式
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
// 輸出: "time":"2013-08-02 03:48:20"

// 方式三:註解級控制
public class Student {
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date time;
}

4. 流式寫入(大數據/文件/網絡流)

JsonGenerator generator = mapper.getFactory().createGenerator(new File("student.json"), JsonEncoding.UTF8);
generator.writeObject(st);
generator.close();

優勢:低內存佔用、支持寫入 OutputStream、文件、網絡流

反序列化(JSON → Java)

1. 全量綁定到 POJO

String json = "{\"objectID\":357,\"geoPoints\":[{\"x\":504604.598,\"y\":305569.915}]}";

public class GeoData {
    public int objectID;
    public List geoPoints = new ArrayList<>();
    public static class Point { public double x; public double y; }
}

GeoData data = mapper.readValue(json, GeoData.class);
// 訪問: data.objectID, data.geoPoints.get(0).x

2. 綁定到 Map/集合

String json = "{\"error\":0,\"data\":{\"name\":\"ABC\",\"age\":20}}";
Map map = mapper.readValue(json, Map.class);
// 訪問: map.get("error"), ((Map)map.get("data")).get("name")

3. 樹模型解析(按需提取,類 DOM)

String json = "{\"results\":[{\"objectID\":357,\"geoPoints\":[{\"x\":504604.598,\"y\":305569.915}]},{\"objectID\":358,\"geoPoints\":[{\"x\":504602.268,\"y\":305554.436}]}]}";

JsonNode root = mapper.readTree(json);
JsonNode results = root.get("results");

for (JsonNode item : results) {
    int objectID = item.get("objectID").asInt();
    JsonNode points = item.get("geoPoints");
    for (JsonNode point : points) {
        double x = point.get("x").asDouble();
        double y = point.get("y").asDouble();
        System.out.println(objectID + " " + x + " " + y);
    }
}
// 輸出:
// 357 504604.598 305569.915
// 358 504602.268 305554.436

特點:結構清晰、按需提取、但需全量加載內存

進階特性

註解驅動

註解用途
@JsonProperty字段名映射
@JsonIgnore忽略字段
@JsonFormat日期/數字格式
@JsonInclude控制 null/空值輸出
@JsonCreator構造器/工廠方法綁定
@JsonSubTypes多態反序列化

多態處理

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
    @JsonSubTypes.Type(value = Dog.class, name = "dog"),
    @JsonSubTypes.Type(value = Cat.class, name = "cat")
})
public abstract class Animal { ... }

Hibernate 支持模塊

// 避免 LazyInitializationException
mapper.registerModule(new Hibernate5Module());

性能優化建議

  1. ObjectMapper 復用:單例模式,避免重複創建開銷
  2. 流式 API 處理大數據:JsonParser/JsonGenerator 避免全量內存
  3. 禁用不需要特性:FAIL_ON_UNKNOWN_PROPERTIES、WRITE_DATES_AS_TIMESTAMPS
  4. Afterburner 模塊:字節碼生成優化,提升 30%+ 性能
  5. 避免大對象圖深度遞歸:合理設計 DTO、使用 @JsonIgnore 斷開循環引用

常見問題排查

問題原因解決
日期輸出時間戳默認 WRITE_DATES_AS_TIMESTAMPS=true配置 false 或 @JsonFormat
反序列化缺少無參構造器POJO 無默認構造器添加無參構造器或 @JsonCreator
未知屬性報錯JSON 包含類中無的字段配置 FAIL_ON_UNKNOWN_PROPERTIES=false
循環引用導致 StackOverflow雙向關聯未斷開@JsonIgnore/@JsonManagedReference/@JsonBackReference
泛型類型擦除List<T> 運行時類型丟失使用 TypeReference 或 JavaType

總結

Jackson 是 Java 生態最強大的 JSON 處理庫,提供數據綁定、樹模型、流式 API 三種範式。掌握 ObjectMapper 配置、日期格式控制、多態處理、性能優化與常見坑點,能高效解決企業級應用中 99% 的 JSON 處理需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved