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

Java JSON 處理實戰(二):org.json 库構建與解析完整指南

     編輯:Java 相關知識

前言

繼上篇介紹 json-lib 後,本文聚焦 org.json (官方參考實現),特點:零依賴、極輕量 (約 30KB),適合 Android、嵌入式或對依賴大小敏感的場景。缺點是無法直接與 JavaBean 互轉,需以 Map 為中介。本文提供通用工具類 JsonHelper 彌補此短板,並給出完整構建/解析示例。

依賴坐標

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20231013</version> <!-- 日期版本號 -->
</dependency>

核心類說明

類對應 JSON 結構常用方法
JSONObject對象 { }put(key, value), getString(key), getInt(key), toString()
JSONArray數組 [ ]put(value), getJSONObject(index), length()
JSONTokener解析器new JSONObject(new JSONTokener(jsonStr))

通用工具類 JsonHelper (JavaBean ⇄ Map ⇄ JSONObject)

public class JsonHelper {
    /** JavaBean → Map (反射獲取 getter) */
    public static Map<String, Object> toMap(Object bean) {
        Map<String, Object> map = new HashMap<>();
        for (Method m : bean.getClass().getDeclaredMethods()) {
            if (m.getName().startsWith("get") && m.getParameterCount() == 0) {
                String key = lowerFirst(m.getName().substring(3));
                try { map.put(key, m.invoke(bean)); } catch (Exception ignored) {}
            }
        }
        return map;
    }

    /** JSON 字符串 → Map */
    public static Map<String, String> toMap(String jsonStr) throws JSONException {
        JSONObject jo = new JSONObject(jsonStr);
        Map<String, String> map = new HashMap<>();
        for (String key : jo.keySet()) map.put(key, jo.getString(key));
        return map;
    }

    /** JavaBean → JSONObject (經 Map 中轉) */
    public static JSONObject toJSON(Object bean) {
        return new JSONObject(toMap(bean));
    }

    /** Map → JavaBean (反射調用 setter) */
    public static void toJavaBean(Object bean, Map<String, Object> map) {
        for (Method m : bean.getClass().getDeclaredMethods()) {
            if (m.getName().startsWith("set") && m.getParameterCount() == 1) {
                String key = lowerFirst(m.getName().substring(3));
                if (map.containsKey(key)) {
                    try { m.invoke(bean, convertType(map.get(key), m.getParameterTypes()[0])); } catch (Exception ignored) {}
                }
            }
        }
    }

    /** JSON 字符串 → JavaBean */
    public static void toJavaBean(Object bean, String jsonStr) throws JSONException {
        toJavaBean(bean, toMap(jsonStr));
    }

    private static String lowerFirst(String s) {
        return Character.toLowerCase(s.charAt(0)) + s.substring(1);
    }
    private static Object convertType(Object val, Class<?> targetType) { /* 簡易類型轉換 */ return val; }
}

完整構建與解析示例

public class OrgJsonDemo {
    static class Employee { // 需提供 getter/setter
        private String name, sex; private int age;
        // ... 省略 getter/setter
    }

    public static void main(String[] args) throws JSONException {
        // 1. 構建複雜 JSON
        JSONObject root = new JSONObject();
        
        // 1.1 List → JSONArray
        List<Map<String, String>> list = new ArrayList<>();
        Map<String, String> m1 = Map.of("name","Alexia","sex","female","age","23");
        Map<String, String> m2 = Map.of("name","Edward","sex","male","age","24");
        list.add(m1); list.add(m2);
        JSONArray ja = new JSONArray(list); // 直接接受 Collection
        root.put("employees", ja);
        
        // 1.2 JavaBean → JSONObject (需 JsonHelper 中轉)
        Employee emp = new Employee(); emp.setName("wjl"); emp.setSex("female"); emp.setAge(24);
        root.put("leader", JsonHelper.toJSON(emp));
        
        String json = root.toString(4); // 4 空格縮進美化輸出
        System.out.println("=== 生成 JSON ===\n" + json);

        // 2. 解析
        JSONObject parsed = new JSONObject(json);
        // 2.1 解析 JSONArray → List
        JSONArray arr = parsed.getJSONArray("employees");
        for (int i = 0; i < arr.length(); i++) {
            JSONObject o = arr.getJSONObject(i);
            System.out.printf("員工 %d: %s %s %d%n", i, o.getString("name"), o.getString("sex"), o.getInt("age"));
        }
        // 2.2 解析 JSONObject → JavaBean
        Employee emp2 = new Employee();
        JsonHelper.toJavaBean(emp2, parsed.getJSONObject("leader").toString());
        System.out.println("Leader: " + emp2.getName() + " " + emp2.getSex() + " " + emp2.getAge());
    }
}

org.json vs json-lib 核心差異對比

維度org.jsonjson-lib
依賴大小~30 KB,零第三方依賴~500 KB,依賴 ezmorph, commons-lang/collections/beanutils/logging
JavaBean 互轉不支持,需手寫 Map 中轉原生支持 JSONObject.toBean() / JSONObject.fromObject(bean)
API 風格接近 JavaScript 原生操作更符合 Java 集合習慣
性能極快,內存佔用極低略慢,對象創建較多
適用場景Android、微服務網關、依賴極簡項目傳統企業應用、需大量 Bean 互轉場景

推薦輔助工具

  • 在線 JSON 編輯/驗證:JSON Editor Online
  • IDE 插件:JSON Tree Viewer (VS Code / IntelliJ) 直接在編輯器可視化結構。

總結

org.json 以「小而美」著稱,通過 JsonHelper 封裝反射轉換邏輯,可輕鬆實現 JavaBean 雙向轉換。在依賴體積受限、性能敏感、或不願引入龐大傳遞鏈的項目中,它是 Jackson/Gson/json-lib 之外的優秀備選。

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