【主流技術】日常工作中關於 JSON 轉換的經驗大全(Java)

CodeBlogMan發表於2024-03-11

目錄
  • 前言
  • 一、JSON 回顧
    • 1.1結構形式
  • 二、其它型別 -> JSON相關
    • 2.1 JavaBean 轉 JsonObject
    • 2.2 JavaBean 轉 Json 字串
    • 2.3 List 轉 JsonArray
    • 2.4 List 轉Json 字串
    • 2.5Map 轉 Json 字串
  • 三、JSON 相關 -> 其它型別
    • 3.1 Json 字串轉 JavaBean
    • 3.2 Json 字串轉 JsonObject
    • 3.3 Json 字串轉 List
    • 3.4Json字串轉Map
  • 四、Json 相關互轉
    • 4.1 Json 陣列字串轉 JsonArray
    • 4.2 JsonObject 轉 Json字串
  • 五、文章小結

前言

JSON 是 JavaScript 資料型別中的一個子集,目前主流的瀏覽器都使用了通用的 JavaScript 引擎元件,所以在解析 JSON 格式時具有良好的相容性。這便是 “JavaScript Object Notation”(縮寫為 JSON )誕生的由來。

本文按照我們的輸入和輸出結果型別進行分類,包括從其它型別轉換到 JSON 相關,以及從 JSON 相關轉換到其它型別這兩大類。

注:以下都是基於阿里的 fastjson 來講解操作的。

fastjson 可以將 JSON Parse 的效能提升到極致,是目前 Java 語言中最快的 JSON 庫。fastjson介面簡單易用,已經被廣泛使用在快取序列化、協議互動、Web 輸出、Android 客戶端等多種應用場景。

<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.83</version>
</dependency>

一、JSON 回顧

在開始分享文章的主要內容前,我們可以先回顧一下關於 JSON 的基礎知識。

1.1結構形式

JSON 有鍵值對形式和陣列形式這2種結構形式。

以下這個例子就是鍵值對型別的:

{
    "playerInfo": {
        "playerName": "Alex",
        "playerAge": 18
    },
    "activityId": "871047729944117248",
    "activityType": "OA",
    "awardId": "886982449056579584",
    "awardName": "OA測試",
    "stageId": "816982449034752351",
    "roundId": "808657473445768946",
    "noticeTypes": "APP"
}

這種結構的 JSON 資料規則是:一個無序的 "key" : "value" 集合,一個 JSON 物件以 { 左括號開始,以 } 右括號結束。每個 "key" 後跟一個英文的 : 冒號,每個"key" : "value"之間使用英文的 , 逗號進行分隔。而每個 JSON 物件是可以巢狀的。

那 JSON 的陣列形式又是怎麼樣的呢?下面同樣再舉一個例子:

{
    "data": {
        "content": [
            {
                "id": "926160574061371392",
                "status": "PROGRESSING",
                "updateContent": "測試一下",
                "version": "10.6.0",
                "createTime": "2023-10-31 17:11:28"
            },
            {
                "id": "926160574061371326",
                "status": "CANCELED",
                "updateContent": "測試測試",
                "version": "123.0",
                "createTime": "2023-10-31 17:11:28"
            }
        ]
    },
    "code": 200,
    "msg": "成功",
    "success": true
}

陣列形式的 JSON 資料就是值(value)的有序集合。一個陣列以 [ 左中括號開始, ] 右中括號結束。值之間使用 , 逗號分隔。


二、其它型別 -> JSON相關

這裡的其它型別,包括 Java 物件、陣列、String 字串、泛型的 以及 Object 物件等;JSON相關表示 Json 物件、Json 字串等。

2.1 JavaBean 轉 JsonObject

實體類如下:

@Data
@EqualsAndHashCode(callSuper = true)//自動生成屬性的 equals() 和 hashCode()方法,同時宣告允許使用用父類的屬性和方法
public class Computer extends BaseEntity {
    /**
     * 中央處理器
     */
    private String cpu;
    /**
     * 記憶體
     */
    private String memory;
    /**
     * GPU
     */
    private String gpu;
    /**
     * 固態硬碟
     */
    private String ssd;
}

實現示例:

    /**
     * JavaBean 轉 JsonObject
     */
    @Test
    public void javaBeanToJsonObject(){
        Computer computer = new Computer();
        computer.setCpu("r7-4800h");
        computer.setGpu("RTX-3060");
        computer.setSsd("512GB");
        computer.setMemory("32GB");
        JSONObject jsonObject = (JSONObject) JSONObject.toJSON(computer);
        log.info("------結果內容:{} 型別為:{}------", jsonObject, jsonObject.getClass());
    }

轉換結果:

【主流技術】日常工作中關於 JSON 轉換的經驗大全(Java)
JavaBean 轉 JsonObject

2.2 JavaBean 轉 Json 字串

實現示例:

    /**
     * JavaBean 轉 Json 字串
     */
    @Test
    public void javaBeanToJsonString(){
        Computer computer = new Computer();
        computer.setCpu("r7-4800h");
        computer.setGpu("RTX-3060");
        computer.setSsd("512GB");
        computer.setMemory("32GB");
        String jsonStr = JSON.toJSONString(computer);
        log.info("------結果內容:{} 型別為:{}------", jsonStr, jsonStr.getClass());
    }

轉換結果:

【主流技術】日常工作中關於 JSON 轉換的經驗大全(Java)
JavaBean 轉 Json 字串

2.3 List 轉 JsonArray

實現示例:

    /**
     * List 轉 JsonArray
     */
    @Test
    public void listToJsonArray(){
        List<Computer> list = computerService.list();
        JSONArray jsonArray = (JSONArray)JSONArray.toJSON(list);
        log.info("------結果內容1:{} 型別為:{}------", jsonArray.get(0), jsonArray.getClass());
        log.info("------結果內容1:{} 型別為:{}------", jsonArray.get(1), jsonArray.getClass());
        log.info("------結果內容1:{} 型別為:{}------", jsonArray.get(2), jsonArray.getClass());
    }

轉換結果:

【主流技術】日常工作中關於 JSON 轉換的經驗大全(Java)
List 轉 JsonArray

2.4 List 轉Json 字串

實現示例:

    /**
     * List 轉 Json 字串
     */
    @Test
    void listToJsonStr() {
        List<Computer> list = new ArrayList<>();
        Computer computerOne = new Computer();
        computerOne.setCpu("r7-4800h");
        computerOne.setGpu("RTX-3060");
        computerOne.setSsd("512GB");
        list.add(computerOne);
        Computer computerTwo = new Computer();
        computerTwo.setCpu("i5-12600k");
        computerTwo.setGpu("RTX-3060Ti");
        computerTwo.setSsd("512GB");
        list.add(computerTwo);
        String listJson = JSON.toJSONString(list);
        System.out.println(listJson);
    }

轉換結果:

【主流技術】日常工作中關於 JSON 轉換的經驗大全(Java)
List 轉 Json 字串

2.5Map 轉 Json 字串

實現示例:

    /**
     * Map 轉 Json 字串
     */
    @Test
    void mapToJsonStr(){
        Map<String, Object> map = new HashMap<>();
        map.put("key1","AAA");
        map.put("key2","bbb");
        map.put("key3","CCC");
        String mapJson = JSON.toJSONString(map);
        System.out.println("mapJson:" + mapJson);
    }

轉換結果:

【主流技術】日常工作中關於 JSON 轉換的經驗大全(Java)
Map 轉 Json 字串

三、JSON 相關 -> 其它型別

3.1 Json 字串轉 JavaBean

實現示例:

    /**
     * Json 字串轉 JavaBean
     */
    @Test
    void jsonStrToJavaBean(){
        Computer computer = new Computer();
        computer.setCpu("r7-4800h");
        computer.setGpu("RTX-3060");
        computer.setSsd("512GB");
        computer.setMemory("32GB");
        String jsonStr = JSON.toJSONString(computer);
        System.out.println(jsonStr);
        Computer result = JSONObject.parseObject(jsonStr, Computer.class);
        System.out.println(result);
    }

轉換結果:

【主流技術】日常工作中關於 JSON 轉換的經驗大全(Java)
Json 字串轉 JavaBean

3.2 Json 字串轉 JsonObject

實現示例:

    /**
     * Json 字串轉 JsonObject
     */
    @Test
    void jsonStrToJsonObject() {
        String jsonStr = "{ 
                     \"activityId\": \"871047729944117248\",\n" +
                "    \"activityType\": \"OA\",\n" +
                "    \"awardId\": \"886982449056579584\",\n" +
                "    \"awardName\": \"OA測試\" }";
        JSONObject parse = JSONObject.parseObject(jsonStr);
        System.out.println(parse.getString("activityId"));
    }

轉換結果:

【主流技術】日常工作中關於 JSON 轉換的經驗大全(Java)
Json 字串轉 JsonObject

3.3 Json 字串轉 List

實現示例:

    /**
     * Json 字串轉 List
     */
    @Test
    void jsonStrToList(){
        String jsonStr = "[{ \"activityId\": \"871047729944117248\",\n" +
                "    \"activityType\": \"OA\",\n" +
                "    \"awardId\": \"886982449056579584\",\n" +
                "    \"awardName\": \"OA測試\" }]";
        List<Map> maps = JSONArray.parseArray(jsonStr, Map.class);
        maps.forEach(System.out::println);
    }

轉換結果:

【主流技術】日常工作中關於 JSON 轉換的經驗大全(Java)
Json 字串轉 List

3.4Json字串轉Map

實現示例:

    /**
     * Json 字串轉 Map
     */
    @Test
    void jsonStrToMap(){
        String jsonStr = "{\"AA\": 1,\"BB\":2,\"CC\":3}";
        Map map = JSONObject.parseObject(jsonStr, Map.class);
        map.forEach((o1, o2) -> System.out.println(o1 + "=" + o2));
    }

轉換結果:

【主流技術】日常工作中關於 JSON 轉換的經驗大全(Java)
Json 字串轉 Map

四、Json 相關互轉

4.1 Json 陣列字串轉 JsonArray

實現示例:

    /**
     * Json 陣列字串轉 JsonArray
     */
    @Test
    void jsonStrToJsonArray() {
        JSONArray jsonArray = new JSONArray();
        //初始化一個 Java 物件
        Computer computer = new Computer();
        computer.setCpu("r7-4800h");
        computer.setGpu("RTX-3060");
        computer.setSsd("512GB");
        //初始化一個 JSONObject 物件
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("AAA", 100);
        //將上述兩個物件都丟到 JSONArray 物件中,即 JSONArray 不是一般的陣列,是可以放各種 Object 到一個 JSONArray 物件裡的
        jsonArray.add(computer);
        jsonArray.add(jsonObject);
        String str = JSONArray.toJSONString(jsonArray);
        System.out.println(str);
        String jsonArrStr = "[{\"cpu\" : \"r7-4800h\",\"gpu\" : \"RTX-3060\"},{\"cpu\" : \"i5-12600K\",\"gpu\" : \"RTX-3060Ti\"}]";
        JSONArray result = JSONArray.parseArray(jsonArrStr);
        result.forEach(o -> System.out.println(o.toString()));
    }

轉換結果:

【主流技術】日常工作中關於 JSON 轉換的經驗大全(Java)
Json 陣列字串轉 JsonArray

4.2 JsonObject 轉 Json字串

實現示例:

    /**
     * JsonObject 轉 Json字串
     */
    @Test
    void jsonObjectToJsonStr() {
        JSONObject jsonObject = new JSONObject();
        //初始化一個 Java 物件
        Computer computer = new Computer();
        computer.setCpu("r7-4800h");
        computer.setGpu("RTX-3060");
        computer.setSsd("512GB");
        jsonObject.put("computer", computer);
        String jsonStr = JSON.toJSONString(jsonObject);
        System.out.println(jsonStr);
    }

轉換結果:

【主流技術】日常工作中關於 JSON 轉換的經驗大全(Java)
JsonObject 轉 Json字串

五、文章小結

關於 Json 格式的介紹和日常開發中的 Json 轉換經驗大全就分享到這裡。如果文章有錯誤和不足,還期待大家的指正。或者大家有什麼其它補充,也歡迎在評論區交流!

相關文章