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