不知道大家在 Java 日常開發中是否會經常遇到關於 JSON 的各種轉換的場景,我把自己日常工作中遇到的 JSON轉換場景做了一個總結,希望可以對大家有幫助。 註:本文都是基於阿裡的 fastjson 來講解操作的。 ...
目錄
前言
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 字元串、泛型的
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());
}
轉換結果:
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());
}
轉換結果:
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());
}
轉換結果:
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);
}
轉換結果:
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 相關 -> 其它類型
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);
}
轉換結果:
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"));
}
轉換結果:
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);
}
轉換結果:
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 相關互轉
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()));
}
轉換結果:
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 格式的介紹和日常開發中的 Json 轉換經驗大全就分享到這裡。如果文章有錯誤和不足,還期待大家的指正。或者大家有什麼其它補充,也歡迎在評論區交流!