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

Java 中 JSONObject 與 JSONArray 核心用法詳解

     編輯:Java 相關知識

依賴引入 (Maven)

<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.fromObjectJSONArray.fromObject
Map✅ 直接轉物件⚠️ 包裹成單元素陣列 [ {...} ]
List/Collection❌ 拋異常✅ 直接轉陣列
Java Bean✅ 屬性→字段⚠️ 包裹成單元素陣列
Array❌✅
JSON 字串✅ (以 { 開頭)✅ (以 [ 開頭)

進階操作

1. Java Bean 雙向轉換

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

2. 複雜嵌套結構

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

3. 輸出格式化

// 緊湊格式 (預設)
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) 等類型安全方法。
  • 循環引用:雙向關聯 Bean 序列化會拋 StackOverflowError,需配置 CycleDetectionStrategy 或使用 @JSONField(serialize=false) 忽略反向引用。
  • 日期格式:預設輸出長整數時間戳,建議全域配置 JsonConfig.registerJsonValueProcessor(Date.class, new DateJsonValueProcessor("yyyy-MM-dd"))。
  • 性能:json-lib 反射基礎,高併發場景建議遷移 Jackson (流式 API、後端編譯器、零拷貝)。

遷移建議:json-lib → Jackson



    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,獲得更佳性能、類型安全與生態支援。

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