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

Java JSON 處理實戰:主流庫對比、核心 API 與避坑指南

     編輯:Java 相關知識

JSON 已成微服務、前後端分離、配置管理的事實標準。Java 生態擁有多個成熟庫,本文對比四大主流庫,詳細演示 Json-lib(文中使用)核心用法,並給出 2024 年技術選型建議。

四大主流 JSON 庫對比 (2024 視角)

庫Maven 坐標特點適用場景
Jacksoncom.fasterxml.jackson.core:jackson-databind效能最優、功能最全、Spring Boot 默認、支援 Kotlin/Scala、模組化擴展首選:高性能、企業級、微服務
Gsoncom.google.code.gson:gsonAPI 簡潔、Google 維護、流式/樹模型雙支援、對 Kotlin data class 友好Android、中小專案、簡單序列化需求
JSON-B (Jakarta EE)jakarta.json.bind:jakarta.json.bind-api + 實現標準化註解 (@JsonbProperty)、CDI 整合、可移植Jakarta EE / MicroProfile 專案
json-lib (舊版)net.sf.json-lib:json-lib早期流行、依賴多 (ezmorph, xom 等)、不再維護、效能較弱僅維護舊專案

json-lib 核心用法演示 (維舊專案參考)

依賴配置

<dependency>
    <groupId>net.sf.json-lib</groupId>
    <artifactId>json-lib</artifactId>
    <version>2.4</version>
    <classifier>jdk15</classifier>
</dependency>

Java 對象 ⇄ JSON 互轉

// 1. 集合/陣列 → JSONArray
List<String> list = List.of("first", "second");
JSONArray jsonArray = JSONArray.fromObject(list); // ["first","second"]

// 2. Map/Bean → JSONObject
Map<String, Object> map = Map.of(
    "name", "JSON", "bool", true, "int", 1, "arr", new String[]{"a","b"}
);
JSONObject jsonObject = JSONObject.fromObject(map); 
// {"name":"JSON","bool":true,"int":1,"arr":["a","b"]}

// 3. JSON → Java 對象 (需註冊類映射)
JSONObject json = JSONObject.fromObject("{\"name\":\"JSON\",\"age\":25}");
User user = (User) JSONObject.toBean(json, User.class); // 需 User 有無參構造器 + setter

// 4. 陣列轉 List<Bean>
JSONArray array = JSONArray.fromObject("[{\"id\":1},{\"id\":2}]");
List<User> users = (List<User>) JSONArray.toCollection(array, User.class);

進階特性

  • JSONFunction:在 JSON 中嵌入 JavaScript 函數字串(前端模板渲染場景)
  • JsonConfig:自定義日期格式、過濾屬性、處理循環引用、類型轉換器
  • XML ⇄ JSON:XMLSerializer 雙向轉換

避坑指南:json-lib 常見問題

問題原因解法
日期序列化為長整數默認輸出 time in millisJsonConfig.setJsonPropertyFilter 或註冊 JsonValueProcessor 格式化
循環引用堆疊溢出雙向關聯 (Parent↔Child)JsonConfig.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT)
Enum 序列化為名稱而非值默認行為實現 JsonBeanProcessor 或改用 Jackson @JsonValue
大數字精度丟失用 Double 存儲改用 BigDecimal + JsonConfig.registerJsonValueProcessor
中文輸出為 \uXXXX默認確保 ASCIIJsonConfig.setEncoding("UTF-8") + 確保輸出流編碼

2024 選型建議:遷移到 Jackson

// Jackson 等價代碼 (更簡潔、效能更高、類型安全)
ObjectMapper mapper = new ObjectMapper()
    .registerModule(new JavaTimeModule()) // Java 8 日期時間支援
    .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
    .setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

// 序列化
String json = mapper.writeValueAsString(userList);

// 反序列化 (類型安全,無需強轉)
List<User> users = mapper.readValue(json, new TypeReference<List<User>>() {});

// 處理循環引用
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

總結

json-lib 完成了歷史使命。新專案無理由不選 Jackson:生態最完善、效能標桿、Spring 生態原生整合、持續活躍維護。維舊專案時,掌握上述避坑點可平穩過渡;重構窗口期到來時,全量遷移 Jackson 是技術債清償的高收益動作。

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