json-lib 是早期經典 JSON 庫,需引入核心包及傳遞依賴:
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier> <!-- 指定 JDK 版本 -->
</dependency>
<!-- 傳遞依賴(通常由 Maven 自動解析) -->
<dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>2.6</version></dependency>
<dependency><groupId>commons-beanutils</groupId><artifactId>commons-beanutils</artifactId><version>1.9.4</version></dependency>
<dependency><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId><version>3.2.2</version></dependency>
<dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency>
<dependency><groupId>net.sf.ezmorph</groupId><artifactId>ezmorph</artifactId><version>1.0.6</version></dependency>
com.fasterxml.jackson.core) 或 Gson (com.google.code.gson),API 更簡潔、性能更優、維護更活躍。本文僅作 json-lib 存量項目維護參考。
| 來源類型 | 目標類型 | 關鍵 API |
|---|---|---|
| Java Bean | JSON 字符串 | JSONObject.fromObject(bean).toString() |
| List/Set | JSON 數組字符串 | JSONArray.fromObject(list).toString() |
| Map | JSON 對象字符串 | JSONObject.fromObject(map).toString() |
| JSON 字符串 | Java Bean | (T) JSONObject.toBean(jsonObj, Clazz.class) |
| JSON 數組字符串 | List<Bean> | JSONArray.toList(jsonArray, Clazz.class) |
| JSON 字符串 | 動態 JSONObject | JSONObject.fromObject(jsonStr) |
public class Person {
private String name;
private int age;
// getter/setter/toString 省略
}
Person p1 = new Person();
p1.setName("劉大江");
p1.setAge(26);
String jsonStr = JSONObject.fromObject(p1).toString();
// 輸出: {"age":26,"name":"劉大江"}
List<Person> personList = new ArrayList<>();
personList.add(new Person("A1", 26));
personList.add(new Person("A2", 23));
// List → JSON 數組
String listJson = JSONArray.fromObject(personList).toString();
// [{"age":26,"name":"A1"},{"age":23,"name":"A2"}]
// Map → JSON 對象
Map<String, Person> personMap = new HashMap<>();
personMap.put("p1", personList.get(0));
personMap.put("p2", personList.get(1));
String mapJson = JSONObject.fromObject(personMap).toString();
// {"p2":{"age":23,"name":"A2"},"p1":{"age":26,"name":"A1"}}
String jsonArrayStr = "[{\"name\":\"A2\",\"age\":23},{\"name\":\"A1\",\"age\":26}]";
JSONArray ja = JSONArray.fromObject(jsonArrayStr);
for (int i = 0; i < ja.size(); i++) {
JSONObject jo = ja.getJSONObject(i); // 動態對象訪問
System.out.println(jo.get("name")); // A2 / A1
// 動態對象 → 實體 Bean
Person p = (Person) JSONObject.toBean(jo, Person.class);
System.out.println(p.getName()); // A2 / A1
}
// 直接轉 List<Bean>(需配置 JsonConfig)
JsonConfig config = new JsonConfig();
config.setRootClass(Person.class);
List<Person> persons = (List<Person>) JSONArray.toCollection(ja, config);
JsonConfig config = new JsonConfig();
// 1. 日期格式化
config.registerJsonValueProcessor(Date.class, new JsonValueProcessor() {
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override public Object processObjectValue(String key, Object value, JsonConfig cfg) {
return value instanceof Date ? sdf.format((Date) value) : value;
}
@Override public Object processArrayValue(Object value, JsonConfig cfg) { return processObjectValue(null, value, cfg); }
});
// 2. 忽略屬性 / 自定義屬性名
config.setExcludes(new String[]{"password", "secret"}); // 序列化排除
config.setPropertyNameProcessor(new PropertyNameProcessor() {
@Override public String processPropertyName(Class cls, String name) {
return name.replace("_", "-"); // snake_case → kebab-case
}
});
// 3. 循環引用檢測
config.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);
// 使用
String json = JSONObject.fromObject(complexObject, config).toString();
JSONObject 而非 Bean,需使用 JSONArray.toList(jsonArray, clazz) 或 JsonConfig 指定 rootClass。JsonValueProcessor 統一格式。@JSONProperty 註解),否則無法自動綁定。<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
// ObjectMapper 線程安全,單例復用
ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
// Bean → JSON
String json = mapper.writeValueAsString(person);
// JSON → Bean
Person p = mapper.readValue(jsonStr, Person.class);
// List → JSON / JSON → List
String listJson = mapper.writeValueAsString(personList);
List<Person> list = mapper.readValue(listJson, new TypeReference<List<Person>>() {});