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

JSON 與 Java 物件互轉完整指南:基於 json-lib 庫的實戰詳解

     編輯:Java 綜合教學

JSON 與 Java 物件互轉完整指南:基於 json-lib 庫的實戰詳解

前言:為什麼選擇 JSON?

在系統整合開發中,資料交換格式常見有 XML 和 JSON 兩種。JSON 作為輕量級資料格式,相比 XML 具有傳輸效率高、結構簡潔、解析速度快等優勢。XML 需要大量標籤包裹,無疑佔用更多網路頻寬;而 JSON 以鍵值對形式呈現,結構清晰,深受前後端開發者青睞。

JSON 兩種基本結構

JSON 主要有兩種表示形式:

1. 物件格式

{"name":"JSON","address":"北京市西城區","age":25}

2. 陣列物件格式

[{"name":"JSON","address":"北京市西城區","age":25}]

兩者唯一差別在於陣列格式外層多了一組 []。內部結構皆為鍵值對,以逗號分隔。前端接收後端回傳的 JSON 字串後,可使用 JSON.parse() 解析為 JavaScript 物件進行遍歷使用。

環境準備:引入 json-lib 依賴

json-lib 是經典的 Java JSON 處理庫,需搭配以下依賴套件:

  • commons-beanutils-1.8.0.jar
  • commons-collections-3.2.1.jar
  • commons-lang-2.5.jar
  • commons-logging-1.1.1.jar
  • ezmorph-1.0.6.jar

下載地址:https://sourceforge.net/projects/json-lib/

核心類別:

  • JSONObject:處理物件格式 {...}
  • JSONArray:處理陣列格式 [...]

一、Java 普通物件(Bean)與 JSON 字串互轉

定義實體類別

package com.cn.study.day3;

public class Student {
    private String name;
    private String age;
    private String address;
    
    // Getter/Setter 方法省略...
    
    @Override
    public String toString() {
        return "Student [name=" + name + ", age=" + age + ", address=" + address + "]";
    }
}

Java 物件 → JSON 字串

public static void convertObject() {
    Student stu = new Student();
    stu.setName("JSON");
    stu.setAge("23");
    stu.setAddress("北京市西城區");
    
    // 方式 1:JSONObject - 產生物件格式
    JSONObject json = JSONObject.fromObject(stu);
    String strJson = json.toString();
    
    // 方式 2:JSONArray - 產生陣列格式
    JSONArray array = JSONArray.fromObject(stu);
    String strArray = array.toString();
    
    System.out.println("strJson: " + strJson);
    System.out.println("strArray: " + strArray);
}

輸出結果:

strJson: {"address":"北京市西城區","age":"23","name":"JSON"}
strArray: [{"address":"北京市西城區","age":"23","name":"JSON"}]

JSON 字串 → Java 物件

public static void jsonStrToJava() {
    // 定義兩種格式字串(需轉義雙引號)
    String objectStr = "{\"name\":\"JSON\",\"age\":\"24\",\"address\":\"北京市西城區\"}";
    String arrayStr = "[{\"name\":\"JSON\",\"age\":\"24\",\"address\":\"北京市西城區\"}]";
    
    // 方式 1:JSONObject 直接轉換
    JSONObject jsonObject = JSONObject.fromObject(objectStr);
    Student stu = (Student) JSONObject.toBean(jsonObject, Student.class);
    
    // 方式 2:JSONArray 需先取出第一個元素
    JSONArray jsonArray = JSONArray.fromObject(arrayStr);
    Object o = jsonArray.get(0);
    JSONObject jsonObject2 = JSONObject.fromObject(o);
    Student stu2 = (Student) JSONObject.toBean(jsonObject2, Student.class);
    
    System.out.println("stu: " + stu);
    System.out.println("stu2: " + stu2);
}

輸出結果:

stu: Student [name=JSON, age=24, address=北京市西城區]
stu2: Student [name=JSON, age=24, address=北京市西城區]

二、List 集合與 JSON 字串互轉

List → JSON 字串

public static void listToJSON() {
    Student stu = new Student();
    stu.setName("JSON");
    stu.setAge("23");
    stu.setAddress("北京市海澱區");
    
    List<Student> lists = new ArrayList<>();
    lists.add(stu);
    
    // List 只能轉為 JSONArray 格式
    // JSONObject.fromObject(lists) 會拋出異常:'object' is an array. Use JSONArray instead
    JSONArray listArray = JSONArray.fromObject(lists);
    System.out.println("listArray: " + listArray.toString());
}

輸出結果:

listArray: [{"address":"北京市海澱區","age":"23","name":"JSON"}]

JSON 字串 → List

public static void jsonToList() {
    String arrayStr = "[{\"name\":\"JSON\",\"age\":\"24\",\"address\":\"北京市西城區\"}]";
    
    // 轉換為 List
    List<Student> list2 = (List<Student>) JSONArray.toList(
        JSONArray.fromObject(arrayStr), Student.class);
    
    for (Student stu : list2) {
        System.out.println(stu);
    }
    
    // 轉換為陣列
    Student[] ss = (Student[]) JSONArray.toArray(
        JSONArray.fromObject(arrayStr), Student.class);
    
    for (Student student : ss) {
        System.out.println(student);
    }
}

三、Map 集合與 JSON 字串互轉

Map → JSON 字串

public static void mapToJSON() {
    Student stu = new Student();
    stu.setName("JSON");
    stu.setAge("23");
    stu.setAddress("中國上海");
    
    Map<String, Student> map = new HashMap<>();
    map.put("first", stu);
    
    // JSONObject 格式
    JSONObject mapObject = JSONObject.fromObject(map);
    System.out.println("mapObject: " + mapObject.toString());
    
    // JSONArray 格式
    JSONArray mapArray = JSONArray.fromObject(map);
    System.out.println("mapArray: " + mapArray.toString());
}

輸出結果:

mapObject: {"first":{"address":"中國上海","age":"23","name":"JSON"}}
mapArray: [{"first":{"address":"中國上海","age":"23","name":"JSON"}}]

JSON 字串 → Map

JSON 字串無法直接轉為 Map,需透過中介 Bean 類別配合 toBean() 三參數版本實現:

// 中介 Bean 類別
public class MyBean {
    private Student first;
    // Getter/Setter 省略...
}

// 轉換代碼
public static void jsonToMap() {
    String strObject = "{\"first\":{\"address\":\"中國上海\",\"age\":\"23\",\"name\":\"JSON\"}}";
    
    JSONObject jsonObject = JSONObject.fromObject(strObject);
    Map map = new HashMap();
    map.put("first", Student.class);  // key 對應 JSON 欄位,value 對應目標類型
    
    // toBean 三參數:JSONObject、目標類別、類型映射 Map
    MyBean my = (MyBean) JSONObject.toBean(jsonObject, MyBean.class, map);
    System.out.println(my.getFirst());
}

輸出結果:

Student [name=JSON, age=23, address=中國上海]

總結

本文詳細示範了 json-lib 處理 Java Bean、List、Map 三種常見資料結構與 JSON 字串的雙向轉換。關鍵要點:

  • JSONObject 對應單一物件 {...}
  • JSONArray 對應陣列/集合 [...]
  • List 集合只能轉為 JSONArray 格式
  • Map 轉物件需配合中介 Bean 及類型映射 Map
  • 複雜巢狀 JSON 處理建議使用 Gson 或 Jackson 等現代化庫

歡迎指正交流,關注後續更多實戰內容!

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