前言
在 Java 開發中,經常需要將前端傳遞或配置文件中的 JSON 格式字符串解析為對象模型進行業務處理。本文介紹基於經典 net.sf.json (json-lib) 庫的字符串轉 JSON 數組、對象遍歷、屬性提取完整流程,並補充現代替代方案建議。
一、依賴準備
Maven 坐標:
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier> <!-- 或 jdk16/jdk17 -->
</dependency>
核心依賴傳遞:commons-lang、commons-beanutils、commons-collections、commons-logging、ezmorph。
二、核心類說明
| 類 | 包 | 用途 |
| JSONArray | net.sf.json | JSON 數組對象,對應 [...] |
| JSONObject | net.sf.json | JSON 對象,對應 {...} |
三、完整代碼實戰
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
public class JsonArrayParseDemo {
public static void main(String[] args) {
// 1. 原始 JSON 字符串(注意:標準 JSON 要求鍵用雙引號,json-lib 對單引號兼容較好)
String str = "[{'name':'a','value':'aa'},{'name':'b','value':'bb'},{'name':'c','value':'cc'},{'name':'d','value':'dd'}]";
// 2. 字符串 → JSONArray
JSONArray jsonArray = JSONArray.fromObject(str);
// 3. 遍歷數組
if (jsonArray.size() > 0) {
for (int i = 0; i < jsonArray.size(); i++) {
// 3.1 獲取第 i 個 JSONObject
JSONObject jsonObject = jsonArray.getJSONObject(i);
// 3.2 提取屬性值
String name = jsonObject.getString("name");
String value = jsonObject.getString("value");
// 3.3 業務處理
System.out.println(name + " = " + value);
// 輸出:
// a = aa
// b = bb
// c = cc
// d = dd
}
}
// 進階:直接獲取所有 name 組成 List
// List names = jsonArray.stream()
// .map(obj -> ((JSONObject)obj).getString("name"))
// .collect(Collectors.toList());
}
}
四、關鍵 API 速查
| 方法 | 說明 | 返回類型 |
JSONArray.fromObject(String) | 字符串解析為 JSONArray | JSONArray |
jsonArray.size() | 數組長度 | int |
jsonArray.getJSONObject(int index) | 按索引獲取 JSONObject | JSONObject |
jsonArray.get(int index) | 按索引獲取原始值 | Object |
jsonObject.getString(String key) | 獲取字符串屬性(自動轉型) | String |
jsonObject.getInt(String key) | 獲取整數屬性 | int |
jsonObject.get(String key) | 獲取原始值 | Object |
jsonObject.containsKey(String key) | 判斷鍵是否存在 | boolean |
五、常見坑與最佳實踐
- 單引號 vs 雙引號:標準 JSON 必須雙引號,json-lib 兼容單引號,但建議生產環境使用標準格式
- 空值處理:
getString("missing") 返回 null,不拋異常;getInt("missing") 返回 0
- 類型轉換安全:優先使用
getString/getInt 等強類型方法,避免手動 Cast
- 大數據量性能:json-lib 基於反射,性能一般。高吞吐場景建議遷移至 Jackson 或 Gson
- 線程安全:JSONArray/JSONObject 非線程安全,多線程環境需同步或使用 ThreadLocal
六、現代替代方案推薦
| 庫 | 特點 | Maven 坐標 |
| Jackson | 高性能、流式解析、註解豐富、Spring Boot 默認 | com.fasterxml.jackson.core:jackson-databind |
| Gson | Google 出品、API 簡潔、對 Kotlin 友好 | com.google.code.gson:gson |
| Fastjson | 阿里出品、極速、國產化首選(注意版本安全漏洞) | com.alibaba:fastjson2 |
Jackson 等價代碼
ObjectMapper mapper = new ObjectMapper();
List
七、總結
掌握 JSON 字符串與 Java 對象互轉是 Web 開發基本功。net.sf.json 雖然歷史悠久、API 直觀,但新項目強烈建議直接使用 Jackson 或 Gson,獲得更好性能、類型安全與生態支持。
- 上一篇文章: JVM 學習筆記(一):垃圾回收算法全景解析與 HotSpot 實踐
- 下一篇文章: JVM 學習筆記(二):GC 觸發條件深度解析與減少 GC 開銷 5 大編程技巧
Copyright ©
程式碼之家 All Rights Reserved