深入理解JSON及其在Java中的應(yīng)用小結(jié)
1.什么是JSON
在現(xiàn)代的Web開發(fā)中,JSON(JavaScript Object Notation)扮演了極其重要的角色。它是一種輕量級的數(shù)據(jù)交換格式,由于其易于閱讀和編寫,同時也易于機器解析和生成,因此廣泛應(yīng)用于網(wǎng)絡(luò)數(shù)據(jù)交換和配置文件。
JSON: J
avaS
cript O
bject N
otation(JavaScript 對象表示法)
JSON 是存儲和交換文本信息的語法,類似 XML。
JSON 比 XML更小、更快,更易解析。
我們來看一下到底什么是JSON數(shù)據(jù):
{ "message": [ { "name":"Leo" , "address":"江蘇省" }, { "name":"Mary" , "address":"湖北省" }, { "name":"Jack" , "address":"浙江省" } ] }
- 關(guān)于 JSON,最重要的是要理解**它是一種數(shù)據(jù)格式,不是一種編程語言。雖然具有相同的語法形式,但 JSON 并不從屬于 JavaScript。**而且,并不是只有 JavaScript 才使用 JSON,畢竟 JSON 只是一種數(shù)據(jù)格式。很多編程語言都有針對 JSON 的解析器和序列化器。JSON 是一個輕量級的數(shù)據(jù)格式,可以簡化表示復(fù)雜數(shù)據(jù)結(jié)構(gòu)的工作量。
- JSON 使用 JavaScript 語法的子集表示對象、數(shù)組、字符串、數(shù)值、布爾值和 null **。
- 即使 XML 也能表示同樣復(fù)雜的數(shù)據(jù)結(jié)果,但JSON 沒有那么煩瑣,而且在 JavaScript 中使用更便利。ECMAScript 5 定義了一個原生的 JSON 對象; JSON對象包含兩個方法: 用于解析 JavaScript Object Notation (JSON) 的
parse()
方法,以及將對象/值
轉(zhuǎn)換為 JSON字符串的stringify()
方法。
2.JSON語法
在了解到什么JSON之后,我們再來講講JSON的語法。
3.認識JSON分支
3.1 JSON字符串
前我一直有個困惑,分不清普通字符串,json字符串和json對象的區(qū)別。經(jīng)過一番研究終于給弄明白了。比如在Java中。
JSON字符串是將JSON數(shù)據(jù)格式化為字符串的形式。這在數(shù)據(jù)傳輸時非常有用,因為JSON數(shù)據(jù)需要被序列化成字符串格式進行網(wǎng)絡(luò)傳輸。例如,一個表示用戶的JSON對象可能會被轉(zhuǎn)換成這樣的字符串:
字符串:這個很好解釋,指使用“”雙引號包括的字符。
"{\"name\": \"Leo\", \"age\": 20, \"isStudent\": false}"
Json字符串:指的是符合Json格式要求的字符串。
3.2 JSON對象
Json對象:指符合Json格式要求的Java對象
{ "name":"Leo" , "age":"20", "isStudetn":false }
3.3 JSON數(shù)組
JSON
數(shù)組其實就是包含了多個 JSON
對象的一個集合,數(shù)組是以 數(shù)組括號 [] 括起來的
[{ "area": "浙江杭州 "name": "李師傅", "age": 25 }, { "area": "北京海淀 "name": "小李", "age": 26 }]
JSON
數(shù)組并一定是要相同的 JSON
對象的集合,也可以是不同的對象,不過我在開發(fā)過程中并沒有這么使用過,感覺挺別扭的。因為如果將多個對象放進一個 JSONArray
中的話,下意識認為是相同類型的集合
下面 ?? 這種類型也是正確的 JSON
數(shù)組格式
[{ "area": "湖北武漢", "name": "Leo", "age": 20 }, { "address": "湖北宜昌", "email": "Jack@qq.com", "phone": 198787891 }]
4.JSONObject
JSONObject是一個在Java中表示JSON對象的類,通常是由像org.json
, Gson
, Jackson
或其他處理JSON的庫提供。以org.json
庫為例,JSONObject
是一個封裝了JSON數(shù)據(jù)的鍵值映射的類。這個類允許你創(chuàng)建新的JSON對象、從字符串解析JSON數(shù)據(jù)以及像操作普通Java對象一樣訪問或修改JSON對象中的數(shù)據(jù)。
簡單來說**JSONObject
** 是根據(jù) JSON
形式在 Java
中存在的對象映射
4.1 功能特點
JSONObject
提供了一系列方法以便與JSON數(shù)據(jù)進行交互。以下是一些常用方法:
- 創(chuàng)建JSON對象: 使用 new 來創(chuàng)建一個空的
JSONObject
,或者通過傳遞一個JSON字符串來構(gòu)造一個已填充的JSONObject
。 - 添加鍵值對: 使用
put
方法可以添加鍵值對,如果鍵已經(jīng)存在,將替換鍵對應(yīng)的值。 - 獲取數(shù)據(jù): 提供了
get
和opt
系列方法來獲取鍵對應(yīng)的值。 get
方法在鍵不存在時會拋出異常,而opt
方法在找不到鍵時會返回一個默認值(例如null
)或指定的默認值。- 轉(zhuǎn)換為字符串:
toString()
方法將JSONObject
轉(zhuǎn)換成JSON格式的字符串。 - 檢查鍵:
has
方法可以檢查JSONObject
是否包含特定的鍵。
4.2 代碼示例
下面我們通過使用org.json
庫中JSONObject
類的做一個簡單示例
/** * @author : Leo * @version 1.0 * @date 2023-11-21 19:38 * @description : */ public class JSONObjectDemo{ public static void main(String[] args) { // 創(chuàng)建一個JSONObject實例 JSONObject jsonObj = new JSONObject(); // 向這個對象添加鍵值對 jsonObj.put("name", "Alice"); jsonObj.put("age", 30); jsonObj.put("hasPet", true); // 輸出JSON對象的字符串表示 System.out.println("JSON Object: " + jsonObj); // 訪問JSONObject中的值 int age = jsonObj.getInt("age"); String name = jsonObj.getString("name"); // 輸出獲取的值 System.out.println("Name: " + name); System.out.println("Age: " + age); // 檢查是否存在鍵 boolean hasAge = jsonObj.has("age"); System.out.println("Has age key? " + hasAge); // 轉(zhuǎn)換JSON對象為JSON字符串 String jsonString = jsonObj.toString(); System.out.println("JSON String: " + jsonString); } }
5.JSONArray
JSONArray
是Java中用于表示JSON數(shù)組的類,類似于JSONObject
,它是用來處理JSON數(shù)據(jù)中的數(shù)組類型。JSON數(shù)組是一個有序的元素集合,每個元素可以是任意類型,如字符串、數(shù)字、JSON對象、其他數(shù)組等。這個類提供了一系列的方法來創(chuàng)建、解析和操作JSON數(shù)組。
5.1 特點
- 有序集合:
JSONArray
中的元素按照它們被添加的順序排列。 - 多種類型: 數(shù)組中可以包含不同類型的元素,包括其他的
JSONObject
或JSONArray
。 - 靈活性: 和
JSONObject
類似,提供了豐富的方法來操作數(shù)組。
5.2 常用方法
- 添加元素: 使用
put
方法來向數(shù)組中添加元素。 - 提取元素: 可以通過索引來取數(shù)組中的元素,使用諸如
getString(index)
,getJSONObject(index)
等方法。 - 修改元素: 可以通過傳遞索引和新值到
put
方法來修改數(shù)組中的元素。 - 數(shù)組長度: 使用
length
方法可以獲取數(shù)組的長度。 - 遍歷數(shù)組: 對
JSONArray
進行遍歷,通常使用for
循環(huán)結(jié)合get
方法訪問每個元素。 - 轉(zhuǎn)換為字符串:
toString
方法可以將整個數(shù)組轉(zhuǎn)換成JSON格式的字符串。
示例代碼
import org.json.JSONArray; import org.json.JSONObject; public class JSONArrayExample { public static void main(String[] args) { // 創(chuàng)建(構(gòu)造)一個JSONArray實例 JSONArray array = new JSONArray(); // 向數(shù)組中添加元素 array.put("apple"); array.put(100); array.put(new JSONObject().put("key", "value")); // 獲取數(shù)組長度 int length = array.length(); // 遍歷JSONArray并輸出每個元素 for (int i = 0; i < length; i++) { System.out.println(array.get(i)); } // 輸出整個JSONArray System.out.println(array.toString()); } }
在上面的代碼中,我們創(chuàng)建了一個JSONArray
對象,并向其中添加了不同類型的元素。我們還遍歷了數(shù)組并打印了每個元素,最后,我們將整個數(shù)組轉(zhuǎn)換成了一個字符串。
5.3 應(yīng)用場景
JSONArray
通常用于處理那些按順序存放同類或不同類數(shù)據(jù)項的場景。在Web開發(fā)中,當(dāng)我們從API接收到一個JSON數(shù)組,或者需要發(fā)送一個JSON數(shù)組時,JSONArray
成為一個理想的工具。此外,當(dāng)從JSON文件中讀取數(shù)據(jù),或者需要生成JSON格式的數(shù)據(jù)進行本地存儲時,也經(jīng)常會用到JSONArray
。
6.FastJson的應(yīng)用
阿里官方給的定義是, fastjson
是阿里巴巴的開源JSON解析庫,它可以解析 JSON 格式的字符串,支持將 Java Bean 序列化為 JSON字符串,也可以從 JSON字符串反序列化到 JavaBean。
6.1 FastJson的優(yōu)點
速度快
fastjson相對其他JSON庫的特點是快,從2011年fastjson發(fā)布1.1.x版本之后,其性能從未被其他Java實現(xiàn)的JSON庫超越。
使用廣泛
fastjson在阿里巴巴大規(guī)模使用,在數(shù)萬臺服務(wù)器上部署,fastjson在業(yè)界被廣泛接受。在2012年被開源中國評選為最受歡迎的國產(chǎn)開源軟件之一。
測試完備
fastjson有非常多的testcase,在1.2.11版本中,testcase超過3321個。每次發(fā)布都會進行回歸測試,保證質(zhì)量穩(wěn)定。
使用簡單
fastjson的 API 十分簡潔。
功能完備
支持泛型,支持流處理超大文本,支持枚舉,支持序列化和反序列化擴展。
6.2 在Java中引用FastJson
要在Java項目中使用FastJson,首先需要將其庫添加到項目的依賴中。如果你使用Maven來管理項目,可以在pom.xml
文件中添加以下依賴:
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>2.0.24</version> </dependency>
6.3 示例代碼
首先我們需要先準(zhǔn)備一個Person對象。
package com.Leo.exer.json; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; /** * @author : Leo * @version 1.0 * @date 2023-11-21 19:52 * @description : */ @Data @AllArgsConstructor @NoArgsConstructor public class Person { private String name; private int age; }
將Java對象轉(zhuǎn)換為Json字符串
Person person = new Person("Leo", 20); // 1.將對象轉(zhuǎn)換為json字符串 String jsonStr = JSON.toJSONString(person); System.out.println("jsonStr = " + jsonStr);
將Json字符串轉(zhuǎn)換為JSONObject對象
//2.將json字符串轉(zhuǎn)換為JSONObject對象 JSONObject jsonObject = JSON.parseObject(jsonStr); System.out.println("jsonObject = " + jsonObject);
將JSONObject轉(zhuǎn)換為Java對象
Person person2 = JSON.toJavaObject(jsonObject, Person.class); System.out.println("person2 = " + person2);
7.JSON格式化網(wǎng)站
這里推薦兩個筆者比較常用的兩個網(wǎng)站
到此這篇關(guān)于深入理解JSON及其在Java中的應(yīng)用的文章就介紹到這了,更多相關(guān)JSON在Java中的應(yīng)用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用多個servlet時Spring security需要指明路由匹配策略問題
這篇文章主要介紹了使用多個servlet時Spring security需要指明路由匹配策略問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08SpringMVC接收java.util.Date類型數(shù)據(jù)的2種方式小結(jié)
這篇文章主要介紹了使用SpringMVC接收java.util.Date類型數(shù)據(jù)的2種方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08基于UDP協(xié)議實現(xiàn)聊天系統(tǒng)
這篇文章主要為大家詳細介紹了基于UDP協(xié)議實現(xiàn)聊天系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-04-04