<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
現代替代方案:推薦使用 Jackson (com.fasterxml.jackson.core) 或 Gson (com.google.code.gson),功能更強、性能更優、維護更活躍。
| 類別 | 對應 JSON 結構 | 常用構建方式 |
|---|---|---|
JSONObject | 物件 {"key": "value"} | 構造器、fromObject(Map)、fromObject(String) |
JSONArray | 陣列 ["a", "b"] | 構造器、fromObject(List)、fromObject(Object[]) |
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import java.util.*;
public class JsonDemo {
public static void main(String[] args) {
// 1. 構建 JSONObject
JSONObject obj = new JSONObject();
obj.put("derek", "23");
obj.put("dad", "49");
obj.put("mom", "45");
System.out.println("構造器建立: " + obj);
// {"derek":"23","dad":"49","mom":"45"}
// 2. Map → JSONObject
Map map = new LinkedHashMap<>();
map.put("derek", "23");
map.put("dad", "49");
map.put("mom", "45");
System.out.println("Map 轉換: " + JSONObject.fromObject(map));
// 3. 構建 JSONArray
JSONArray arr = new JSONArray();
arr.add("derek");
arr.add("dad");
arr.add("mom");
System.out.println("構造器建立陣列: " + arr);
// ["derek","dad","mom"]
// 4. List → JSONArray
List list = Arrays.asList("derek", "dad", "mom");
System.out.println("List 轉換: " + JSONArray.fromObject(list));
// 5. Map → JSONArray (特殊:單元素陣列包裹物件)
System.out.println("Map→JSONArray: " + JSONArray.fromObject(map));
// [{"derek":"23","dad":"49","mom":"45"}]
// 6. JSON 字串 → JSONObject
String jsonStr = "{\"derek\":23,\"dad\":49,\"mom\":45}";
JSONObject parsed = JSONObject.fromObject(jsonStr);
System.out.println("字串解析: " + parsed);
// {"derek":23,"dad":49,"mom":45} (數值型別保留)
// 7. 遍歷 JSONObject
for (Object key : obj.keySet()) {
System.out.println(key + ": " + obj.get(key));
}
}
}
| 輸入來源 | JSONObject.fromObject | JSONArray.fromObject |
|---|---|---|
Map | ✅ 直接轉物件 | ⚠️ 包裹成單元素陣列 [ {...} ] |
List/Collection | ❌ 拋異常 | ✅ 直接轉陣列 |
Java Bean | ✅ 屬性→字段 | ⚠️ 包裹成單元素陣列 |
Array | ❌ | ✅ |
| JSON 字串 | ✅ (以 { 開頭) | ✅ (以 [ 開頭) |
// Bean → JSON
User user = new User("Alice", 25);
JSONObject json = JSONObject.fromObject(user);
// {"name":"Alice","age":25}
// JSON → Bean (需 setter)
User u2 = (User) JSONObject.toBean(json, User.class);
JSONObject root = new JSONObject();
root.put("user", user);
root.put("tags", Arrays.asList("vip", "active"));
root.put("scores", new int[]{90, 85, 95});
// {"user":{"name":"Alice","age":25},"tags":["vip","active"],"scores":[90,85,95]}
// 緊湊格式 (預設)
String compact = json.toString();
// 縮排格式 (需配置 JsonConfig)
JsonConfig cfg = new JsonConfig();
cfg.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);
String pretty = json.toString(4); // 4 空格縮排
JSONArray.fromObject(list) 返回 JSONArray,泛型資訊丟失,取值需強轉或用 getString(i) 等類型安全方法。StackOverflowError,需配置 CycleDetectionStrategy 或使用 @JSONField(serialize=false) 忽略反向引用。JsonConfig.registerJsonValueProcessor(Date.class, new DateJsonValueProcessor("yyyy-MM-dd"))。
com.fasterxml.jackson.core
jackson-databind
2.17.0
// 使用範例
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(user); // Bean → JSON
User u = mapper.readValue(json, User.class); // JSON → Bean
JsonNode node = mapper.readTree(json); // 通用樹模型
JSONObject 對應 JSON 物件,JSONArray 對應 JSON 陣列。核心入口為構造器 put/add 與靜態工廠 fromObject。掌握 Map/List/Bean/字串四大來源轉換規則、遍歷方式、嵌套構建及格式化輸出,即可覆蓋絕大多數業務場景。新專案強烈建議直接採用 Jackson 或 Gson,獲得更佳性能、類型安全與生態支援。