深入理解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: JavaScript Object Notation(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.認(rèn)識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 中的話,下意識認(rèn)為是相同類型的集合
下面 ?? 這種類型也是正確的 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方法在找不到鍵時會返回一個默認(rèn)值(例如null)或指定的默認(rèn)值。- 轉(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-08
SpringMVC接收java.util.Date類型數(shù)據(jù)的2種方式小結(jié)
這篇文章主要介紹了使用SpringMVC接收java.util.Date類型數(shù)據(jù)的2種方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
基于UDP協(xié)議實現(xiàn)聊天系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了基于UDP協(xié)議實現(xiàn)聊天系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-04-04

