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

Java JSONObject 使用全攻略:依賴配置、對象轉換與數據綁定

     編輯:Java 程式設計入門

依賴引入(json-lib 體系)

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>
💡 現代替代建議:新項目優先考慮 Jackson (com.fasterxml.jackson.core) 或 Gson (com.google.code.gson),API 更簡潔、性能更優、維護更活躍。本文僅作 json-lib 存量項目維護參考。

核心類與轉換矩陣

來源類型目標類型關鍵 API
Java BeanJSON 字符串JSONObject.fromObject(bean).toString()
List/SetJSON 數組字符串JSONArray.fromObject(list).toString()
MapJSON 對象字符串JSONObject.fromObject(map).toString()
JSON 字符串Java Bean(T) JSONObject.toBean(jsonObj, Clazz.class)
JSON 數組字符串List<Bean>JSONArray.toList(jsonArray, Clazz.class)
JSON 字符串動態 JSONObjectJSONObject.fromObject(jsonStr)

實戰代碼示例

1. Bean → JSON

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":"劉大江"}

2. 集合 → JSON

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"}}

3. JSON → Java 對象(反序列化)

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 客製化

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();

常見問題與排查

  • ClassCastException:反序列化時泛型擦除導致 List 元素為 JSONObject 而非 Bean,需使用 JSONArray.toList(jsonArray, clazz) 或 JsonConfig 指定 rootClass。
  • 日期格式不一致:默認輸出長整型時間戳,需註冊 JsonValueProcessor 統一格式。
  • 字段名不匹配:JSON 鍵需與 Bean 屬性名一致(或配合 @JSONProperty 註解),否則無法自動綁定。
  • 性能瓶頸:json-lib 基於反射且無緩存,高併發場景建議遷移至 Jackson/Gson。

遷移指南:json-lib → Jackson

<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>>() {});
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved