Java學(xué)習(xí)之如何進(jìn)行JSON解析
一. JSON簡(jiǎn)介
1. 概念
JSON(JavaScript Object Notation)是一種輕量級(jí)的數(shù)據(jù)交換格式,它算是JavaScript語(yǔ)言的一部分,與XML一樣都可以用于數(shù)據(jù)的存儲(chǔ)和傳輸。一個(gè)JSON文檔可以由JSON對(duì)象和JSON數(shù)組兩部分組成,內(nèi)部的格式由鍵值對(duì)組成。在實(shí)際應(yīng)用中,我們經(jīng)常會(huì)把JSON數(shù)組和JSON對(duì)象組合起來(lái)構(gòu)建成復(fù)雜的數(shù)據(jù)結(jié)構(gòu),以滿足不同的需求。
2. 優(yōu)缺點(diǎn)
JSON這種信息載體,相比XML來(lái)說(shuō),具有自己鮮明的特點(diǎn),具體來(lái)說(shuō),就是具有如下優(yōu)缺點(diǎn)。
2.1 JSON的優(yōu)點(diǎn)
- 易于讀寫(xiě):JSON的格式非常簡(jiǎn)單,易于讀寫(xiě)和維護(hù);
- 易于解析:JSON數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)單,解析速度快,可以很方便地被各種編程語(yǔ)言所解析;
- 易于傳輸:JSON數(shù)據(jù)量小,傳輸速度快,非常適合于網(wǎng)絡(luò)傳輸;
- 易于擴(kuò)展:JSON支持嵌套,可以很方便地添加新的數(shù)據(jù)結(jié)構(gòu);
- 與JavaScript兼容:JSON是JavaScript的一個(gè)子集,可以很方便地被JavaScript解析。
2.2 JSON的缺點(diǎn)
但是JSON也不是說(shuō)就十全十美,同樣也有一些小缺點(diǎn)。
- 無(wú)注釋:JSON數(shù)據(jù)中不支持注釋?zhuān)@使得JSON文件的可讀性變得較差;
- 無(wú)標(biāo)準(zhǔn):JSON沒(méi)有統(tǒng)一的標(biāo)準(zhǔn)定義,各種實(shí)現(xiàn)之間有一定的差異;
- 不支持二進(jìn)制數(shù)據(jù):JSON只支持文本數(shù)據(jù),不支持二進(jìn)制數(shù)據(jù),這在一些場(chǎng)景中可能會(huì)受到限制;
- 可讀性差:由于JSON的格式比較簡(jiǎn)單,因此在一些復(fù)雜的數(shù)據(jù)結(jié)構(gòu)中,可能會(huì)出現(xiàn)可讀性差的情況。
但總的來(lái)說(shuō),瑕不掩瑜,JSON作為一種非常方便、易于使用的數(shù)據(jù)格式,具有良好的跨平臺(tái)性和易擴(kuò)展性,常用于前后端數(shù)據(jù)交互、移動(dòng)應(yīng)用開(kāi)發(fā)、IoT應(yīng)用等場(chǎng)景中。
3. JSON與XML對(duì)比
正是基于以上特點(diǎn),所以在現(xiàn)代開(kāi)發(fā)中,JSON比XML更常用。畢竟JSON具有更簡(jiǎn)單、更清晰的語(yǔ)法和結(jié)構(gòu),同時(shí)也比XML更輕量級(jí)、更易于解析和處理。此外,JSON也更適合于Web應(yīng)用程序和移動(dòng)應(yīng)用程序,因?yàn)樗梢愿斓卦诳蛻?hù)端和服務(wù)器之間傳輸數(shù)據(jù)。當(dāng)然在某些特殊的應(yīng)用場(chǎng)景中,如數(shù)據(jù)交換和存儲(chǔ)等,XML仍然是一種重要的數(shù)據(jù)格式。請(qǐng)大家來(lái)看看做的JSON與XML對(duì)比總結(jié),如下表所示:
**** | JSON | XML |
---|---|---|
格式 | 輕量、易讀 | 冗長(zhǎng)、復(fù)雜 |
數(shù)據(jù)類(lèi)型 | 數(shù)組、對(duì)象、字符串、數(shù)字、布爾 | 數(shù)組、對(duì)象、字符串、數(shù)字、布爾 |
解析庫(kù) | Jackson、Gson | DOM、SAX、JAXB |
可讀性 | 易于閱讀和理解 | 需要熟悉格式和標(biāo)簽 |
應(yīng)用場(chǎng)景 | 前后端數(shù)據(jù)交互、API數(shù)據(jù)傳輸 | 數(shù)據(jù)存儲(chǔ)、傳輸、配置 |
大家可以根據(jù)自己的實(shí)際需要,選擇合適的格式進(jìn)行數(shù)據(jù)的存儲(chǔ)和傳輸。
4. 使用場(chǎng)景
我們現(xiàn)在知道,JSON作為一種輕量級(jí)的數(shù)據(jù)交換格式,具有易讀性、易于編寫(xiě)和解析的特點(diǎn),因此經(jīng)常用于前后端數(shù)據(jù)交互。具體來(lái)說(shuō),經(jīng)常會(huì)用于以下這些場(chǎng)景中:
- Web開(kāi)發(fā)中,前后端數(shù)據(jù)交互。
- 移動(dòng)應(yīng)用開(kāi)發(fā)中,客戶(hù)端與服務(wù)器數(shù)據(jù)交互。
- IoT應(yīng)用中,設(shè)備與云端數(shù)據(jù)交互。
- 大數(shù)據(jù)應(yīng)用中,數(shù)據(jù)交換和存儲(chǔ)。
- 日志處理中,日志數(shù)據(jù)的存儲(chǔ)和分析。
- 軟件測(cè)試中,數(shù)據(jù)的生成和驗(yàn)證。
- 其他各種數(shù)據(jù)交換場(chǎng)景。
除了以上這些應(yīng)用之外,當(dāng)然還有很多其他的使用場(chǎng)景,在此就不再細(xì)說(shuō)了。
二. JSON語(yǔ)法
1. 基本構(gòu)成
JSON文檔有 JSON對(duì)象和JSON數(shù)組 兩種基本類(lèi)型, 這兩種基本類(lèi)型又主要由以下幾個(gè)部分組成:
- 對(duì)象(Object) :由一組鍵值對(duì)組成,使用大括號(hào)({})包含,鍵值對(duì)之間使用逗號(hào)(,)分隔;
- 數(shù)組(Array) :由一組有序的值組成,使用中括號(hào)([])包含,值之間使用逗號(hào)(,)分隔;
- 值(Value) :由一組有序的值組成,使用中括號(hào)([])包含,值之間使用逗號(hào)(,)分隔;
- 鍵(Key) :一個(gè)字符串,用于表示對(duì)象中的一個(gè)鍵值對(duì)的鍵;
- 字符串(String) :由一組字符組成。在JSON中,字符串必須使用雙引號(hào)("")包含;
- 數(shù)字(Number) :一個(gè)整數(shù)或浮點(diǎn)數(shù);
- 布爾值(Boolean) :true或false;
- 空值(Null) :表示一個(gè)空值,只有一個(gè)關(guān)鍵字null。
其中,JSON對(duì)象要使用大括號(hào){}
包裹起來(lái),在大括號(hào){}內(nèi)部可以包含多個(gè)鍵值對(duì)。每個(gè)鍵值對(duì)由一個(gè)鍵和一個(gè)值組成,鍵和值之間使用冒號(hào):
分隔,而多個(gè)鍵值對(duì)之間要使用逗號(hào),
分隔。鍵值對(duì)的鍵是一個(gè)字符串,值可以是任意類(lèi)型的數(shù)據(jù),可以是數(shù)字、字符串、布爾值、數(shù)組或其他JSON對(duì)象。如下所示:
{ "name": "一一哥", "age": 25, "email": "yyg@example.com" }
上面的JSON對(duì)象有三個(gè)鍵值對(duì),分別是name、age和email,它們的值分別是字符串、數(shù)字和字符串類(lèi)型。
而JSON數(shù)組可以看作是一組有序的值,整個(gè)數(shù)組要使用中括號(hào)[]
包裹起來(lái)。在JSON數(shù)組中可以包裹其他的JSON對(duì)象或數(shù)組,進(jìn)行多重嵌套。數(shù)組中的每個(gè)值也都可以是任意類(lèi)型的數(shù)據(jù)(包括字符串、數(shù)字、對(duì)象、數(shù)組等),值之間同樣使用逗號(hào),
分隔。如下所示:
[ "apple", "banana", "cherry", { "name": "一一哥", "age": 30 }, [1, 2, 3] ]
上面的JSON數(shù)組有五個(gè)值,分別是三個(gè)字符串、一個(gè)對(duì)象和一個(gè)數(shù)組。其中,第四個(gè)值是一個(gè)JSON對(duì)象,第五個(gè)值是一個(gè)JSON數(shù)組。
雖然JSON對(duì)象和JSON數(shù)組在語(yǔ)法上有所不同,但它們都是用來(lái)表示JSON數(shù)據(jù)的常用結(jié)構(gòu)。在實(shí)際應(yīng)用中,我們可以將它們組合嵌套起來(lái)構(gòu)建出更加復(fù)雜的數(shù)據(jù)結(jié)構(gòu),以滿足不同的需求。比如下面這個(gè)JSON文檔:
{ "name": "一一哥", "age": 25, "email": "yyg@126.com", "hobbies": [ "吃飯飯", "音樂(lè)", { "name": "鋼琴", "level": 3 } ] }
在上面這個(gè)文檔中,定義了一個(gè)包含四個(gè)鍵值對(duì)的JSON對(duì)象,其中name、age和email是字符串類(lèi)型的key。hobbies是一個(gè)包含三個(gè)元素的JSON數(shù)組,其中前兩個(gè)元素是字符串,第三個(gè)元素又是一個(gè)JSON對(duì)象,包含name和level兩個(gè)鍵值對(duì)。注意,在JSON數(shù)組中可以包含任意類(lèi)型的元素,包括字符串、數(shù)字、對(duì)象、數(shù)組等。
為了讓大家更好地搞清楚JSON語(yǔ)法的構(gòu)成,接下來(lái)再分別給大家講解一下JSON語(yǔ)法中的各個(gè)組成部分。
2. 對(duì)象
JSON對(duì)象是一組由鍵值對(duì)組成的無(wú)序集合,用大括號(hào){}
包裹。每個(gè)鍵值對(duì)之間使用逗號(hào),
分隔。鍵是一個(gè)字符串,值可以是任意類(lèi)型的數(shù)據(jù),包括對(duì)象、數(shù)組、字符串、數(shù)字、布爾值和空值。我們來(lái)看下面這個(gè)包含了三個(gè)鍵值對(duì)的JSON對(duì)象:
{ "name": "一一哥", "age": 20, "city": "上海" }
3. 數(shù)組
JSON數(shù)組是一組有序的值的集合,用中括號(hào)[]
包裹。每個(gè)值之間使用逗號(hào),
分隔,值可以是任意類(lèi)型的數(shù)據(jù),包括對(duì)象、數(shù)組、字符串、數(shù)字、布爾值和空值。我們來(lái)看下面這個(gè)包含了三個(gè)值的JSON數(shù)組:
["apple", "banana", "cherry"]
4. 值
JSON的值可以是任意類(lèi)型的數(shù)據(jù),包括對(duì)象、數(shù)組、字符串、數(shù)字、布爾值和空值。例如:
{ "name": "一一哥", "age": 20, "isMarried": false, "hobbies": ["讀書(shū)", "運(yùn)動(dòng)", "音樂(lè)"], "address": { "street": "上海同濟(jì)支路199號(hào)", "city": "上海", "zipcode": "10001" }, "phoneNumbers": [ { "type": "home", "number": "555-1234" }, { "type": "work", "number": "555-5678" } ] }
上面的JSON對(duì)象中包含了字符串、數(shù)字、布爾值、數(shù)組和對(duì)象等多種類(lèi)型的值。
5. 鍵
JSON對(duì)象中的鍵必須是字符串類(lèi)型,要用雙引號(hào)""
包裹。鍵應(yīng)該是唯一的,重復(fù)的鍵會(huì)被覆蓋。例如:
{ "name": "一一哥", "age": 30, "city": "上海" }
6. 字符串
JSON字符串是由雙引號(hào)""
包含的任意Unicode字符序列,字符串中可以包含轉(zhuǎn)義字符,如下表所示:
轉(zhuǎn)義字符 | 描述 |
---|---|
\" | 雙引號(hào) |
\\ | 反斜杠 |
\/ | 正斜杠 |
\b | 退格符 |
\f | 換頁(yè)符 |
\n | 換行符 |
\r | 回車(chē)符 |
\t | 水平制表符(tab) |
\uXXXX | Unicode代碼(XXXX表示四位數(shù)字) |
例如:
{ "name": "一一哥", "city": "上海", "address": "123 Main Street\\nApt 4B" }
7. 數(shù)字
JSON中的數(shù)字可以是整數(shù)或浮點(diǎn)數(shù),可以帶正負(fù)號(hào)和小數(shù)點(diǎn)。例如:
{ "age": 30, "price": 12.99, "temperature": -5.6 }
8. 布爾值
JSON中的布爾值只有兩個(gè)取值,即true和false。例如:
{ "isMarried": true, "hasChildren": false }
9. 空值
JSON中的空值表示為null。例如:
{ "name": "一一哥", "address": null }
在JSON解析時(shí),我們可以將null轉(zhuǎn)換為Java中的null值,表示缺少數(shù)據(jù)。
熟悉了JSON的基本語(yǔ)法之后,再來(lái)帶大家學(xué)習(xí)如何實(shí)現(xiàn)JSON解析,該部分的內(nèi)容主要包括將一個(gè)Java對(duì)象轉(zhuǎn)為JSON字符串,和把JSON字符串轉(zhuǎn)為對(duì)應(yīng)的Java對(duì)象。
三. JSON解析
1. 概述
我們先來(lái)看看什么是JSON解析。
JSON解析就是把使用JSON格式編寫(xiě)的數(shù)據(jù),轉(zhuǎn)換為計(jì)算機(jī)程序可以使用的數(shù)據(jù)類(lèi)型。在Java中,有許多JSON解析庫(kù)可供我們進(jìn)行使用,比如Jackson、FastJSON、Gso n等。接下來(lái)主要是結(jié)合Java推薦的Jackson來(lái)給大家介紹JSON解析的概念、原理和具體實(shí)現(xiàn)方法。
2. JSON解析原理
在我們開(kāi)始進(jìn)行JSON解析之前,我們先來(lái)看看解析的實(shí)現(xiàn)原理。
JSON解析的實(shí)現(xiàn)原理其實(shí)就是將JSON字符串轉(zhuǎn)換為Java對(duì)象,或反過(guò)來(lái)將Java對(duì)象轉(zhuǎn)換為JSON字符串。其中,將Java對(duì)象轉(zhuǎn)換為JSON字符串的過(guò)程稱(chēng)為序列化;反之,將JSON字符串轉(zhuǎn)換為Java對(duì)象的過(guò)程稱(chēng)為反序列化。在Java中,我們通常是使用反射技術(shù)來(lái)實(shí)現(xiàn)JSON解析,即根據(jù)JSON字符串中的數(shù)據(jù)類(lèi)型,利用Java的反射機(jī)制動(dòng)態(tài)地創(chuàng)建出對(duì)應(yīng)的Java對(duì)象,并將JSON字符串中的數(shù)據(jù)賦值給Java對(duì)象的各個(gè)屬性。
3. Jackson簡(jiǎn)介
3.1 概述
Jackson是一個(gè)流行的Java JSON解析庫(kù),可以將JSON字符串轉(zhuǎn)換為Java對(duì)象,也可以將Java對(duì)象轉(zhuǎn)換為JSON字符串。它支持流式API、數(shù)據(jù)綁定和樹(shù)模型等多種解析方式,同時(shí)還給我們提供了許多注解,用于控制JSON序列化和反序列化。具有性能高、使用簡(jiǎn)單等優(yōu)點(diǎn)。
3.2 常用API
我們?cè)诶肑ackson開(kāi)發(fā)時(shí),肯定會(huì)用到ObjectMapper類(lèi),該類(lèi)是Jackson框架中最核心的類(lèi)之一,它可以將Java對(duì)象轉(zhuǎn)換為JSON字符串,或反過(guò)來(lái)將JSON字符串轉(zhuǎn)換為Java對(duì)象。以下是ObjectMapper類(lèi)的一些常用方法:
- readValue:將JSON字符串轉(zhuǎn)換為Java對(duì)象;
- writeValueAsString:將Java對(duì)象轉(zhuǎn)換為JSON字符串;
- writeValue:將Java對(duì)象寫(xiě)入輸出流中。
這幾個(gè)方法需要大家牢牢記住,除此之外,Jackson中還有以下幾個(gè)常用的注解:
- @JsonProperty:用于在JSON屬性名和Java屬性名之間建立起映射關(guān)系;
- @JsonFormat:用于指定日期類(lèi)型的格式;
- @JsonIgnore:用于指定某個(gè)屬性,不參與序列化和反序列化;
- @JsonInclude:用于指定某個(gè)屬性的條件序列化和反序列化。
3.3 核心依賴(lài)
由于Jackson并不是Java本身自帶的API,所以如果我們想在Java中使用Jackson,就需要導(dǎo)入相關(guān)的依賴(lài)。如果我們是在Maven項(xiàng)目中,可以通過(guò)如下坐標(biāo)導(dǎo)入依賴(lài):
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.12.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.12.3</version> </dependency>
其中,jackson-core和jackson-databind是Jackson最常用的模塊,里面包含了JSON序列化和反序列化的核心功能。我們還可以根據(jù)需要導(dǎo)入其他的Jackson模塊,如jackson-annotations等。因?yàn)槲覀儸F(xiàn)在還沒(méi)有學(xué)習(xí)Maven,所以只能手動(dòng)導(dǎo)入相關(guān)的依賴(lài)了。在導(dǎo)入依賴(lài)之后,我們就可以開(kāi)始使用Jackson進(jìn)行JSON解析了,請(qǐng)大家繼續(xù)往下看。
4. 序列化
我們?cè)谶M(jìn)行前后端數(shù)據(jù)交互時(shí),前端通常是使用JSON格式來(lái)傳遞數(shù)據(jù),后端則需要將這些JSON格式的數(shù)據(jù)轉(zhuǎn)換為Java對(duì)象進(jìn)行處理。同時(shí),后端也需要將Java對(duì)象轉(zhuǎn)換為JSON格式,以便前端使用。所以前后端之間就需要進(jìn)行不同格式之間的轉(zhuǎn)換,這就是序列化和反序列化。在前面講過(guò),序列化就是將Java對(duì)象轉(zhuǎn)換為JSON字符串的過(guò)程 。
4.1 對(duì)象轉(zhuǎn)字符串
我們先來(lái)看一個(gè)簡(jiǎn)單的序列化代碼,將一個(gè)Java對(duì)象轉(zhuǎn)為json字符串,如下所示:
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; /** * @author 一一哥Sun */ public class Demo01 { public static void main(String[] args) { try { //創(chuàng)建一個(gè)Person對(duì)象 Person person=new Person(); person.setName("一一哥"); person.setAge(20); person.setAddress("上海校區(qū)"); //創(chuàng)建一個(gè)ObjectMapper對(duì)象映射對(duì)象 ObjectMapper mapper = new ObjectMapper(); //序列化:將Java對(duì)象轉(zhuǎn)為json字符串 String json = mapper.writeValueAsString(person); System.out.println("json="+json); } catch (JsonProcessingException e) { e.printStackTrace(); } } }
執(zhí)行結(jié)果如下圖所示:
4.2 集合轉(zhuǎn)字符串
除了可以將單個(gè)Java對(duì)象轉(zhuǎn)為JSON字符串之外,我們還可以將Java數(shù)組、集合等復(fù)雜對(duì)象類(lèi)型轉(zhuǎn)為JSON字符串,實(shí)現(xiàn)Java對(duì)象與JSON數(shù)組之間的轉(zhuǎn)換。代碼如下所示:
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; /** * @author 一一哥Sun */ public class Demo03 { public static void main(String[] args) { try { //創(chuàng)建一個(gè)集合 Map<String,List<Person>> map=new HashMap<>(); List<Person> list=new ArrayList<>(); Person p1=new Person(); p1.setName("一一哥"); p1.setAge(20); p1.setAddress("山東"); Person p2=new Person(); p2.setName("壹哥"); p2.setAge(18); p2.setAddress("北京校區(qū)"); Person p3=new Person(); p3.setName("孫老師"); p3.setAge(30); p3.setAddress("青島校區(qū)"); list.add(p1); list.add(p2); list.add(p3); map.put("persons", list); //創(chuàng)建一個(gè)ObjectMapper對(duì)象映射對(duì)象 ObjectMapper mapper = new ObjectMapper(); //序列化:將Java對(duì)象轉(zhuǎn)為json字符串 String json = mapper.writeValueAsString(map); System.out.println("json="+json); } catch (JsonProcessingException e) { e.printStackTrace(); } } }
執(zhí)行結(jié)果如下圖所示:
5. 反序列化
5.1 字符串轉(zhuǎn)對(duì)象
而反序列化,就是將JSON字符串轉(zhuǎn)換為Java對(duì)象的過(guò)程。我們來(lái)看看如下代碼:
import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; /** * @author 一一哥Sun */ public class Demo02 { public static void main(String[] args) { //先創(chuàng)建一個(gè)ObjectMapper對(duì)象映射對(duì)象 ObjectMapper mapper = new ObjectMapper(); //允許json字符串中有單引號(hào),解決JsonParseException: //Unexpected character (''' (code 39)): was expecting double-quote to start field name mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true); String jsonString = "{'name':'一一哥','age':18,'address':'上海'}"; try { //反序列化:將JSON字符串轉(zhuǎn)換為對(duì)應(yīng)的Java對(duì)象 Person person = mapper.readValue(jsonString, Person.class); System.out.println(person.getName()+"--"+person.getAge()+"--"+person.getAddress()); } catch (JsonProcessingException e) { //處理json處理異常 e.printStackTrace(); } } }
執(zhí)行結(jié)果如下圖所示:
在上面的案例中,我們首先創(chuàng)建了一個(gè)ObjectMapper對(duì)象,然后使用readValue方法將JSON字符串轉(zhuǎn)換為Person對(duì)象。Person類(lèi)需要擁有對(duì)應(yīng)的屬性和getter/setter方法,最后輸出了person對(duì)象的name和age等屬性。
5.2 字符串轉(zhuǎn)集合
除了可以將JSON字符串轉(zhuǎn)為單個(gè)對(duì)象,我們也可以將一個(gè)復(fù)雜的JSON字符串轉(zhuǎn)為一個(gè)合適的集合對(duì)象類(lèi)型。
import java.util.List; import java.util.Map; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; /** * @author 一一哥Sun */ public class Demo04 { public static void main(String[] args) { // 先創(chuàng)建一個(gè)ObjectMapper對(duì)象映射對(duì)象 ObjectMapper mapper = new ObjectMapper(); // 允許json字符串中有單引號(hào),解決JsonParseException: // Unexpected character (''' (code 39)): was expecting double-quote to start // field name mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true); String jsonString = "{'persons':[{'name':'一一哥','age':20,'address':'上海校區(qū)'},{'name':'壹哥','age':18,'address':'北京校區(qū)'}]}"; try { // 反序列化:將JSON字符串轉(zhuǎn)換為對(duì)應(yīng)的Java對(duì)象 //直接將json字符串轉(zhuǎn)為對(duì)應(yīng)的Java對(duì)象 Persons persons = mapper.readValue(jsonString, Persons.class); List<Person> list = persons.getPersons(); for (Person person : list) { System.out.println(person.getName() + "--" + person.getAge() + "--" + person.getAddress()); } // 也可以直接將json字符串轉(zhuǎn)為Map集合 Map<String, Person> map = mapper.readValue(jsonString, Map.class); for (Map.Entry<String, Person> entry : map.entrySet()) { System.out.println(entry.toString()); } } catch (JsonProcessingException e) { // 處理json處理異常 e.printStackTrace(); } } }
執(zhí)行結(jié)果如下圖所示:
在上面的案例中,我們創(chuàng)建了一個(gè)Persons類(lèi),內(nèi)部包含了一個(gè)包含Person對(duì)象的List列表。然后使用ObjectMapper對(duì)象將JSON字符串轉(zhuǎn)換為Person對(duì)象,最后遍歷PersonList中的每個(gè)Person對(duì)象,輸出其屬性值。這個(gè)案例中,JSON字符串中的name、age和address屬性,分別對(duì)應(yīng)了Person類(lèi)中的name、age和address屬性。
我們就是通過(guò)以上這幾種方式,實(shí)現(xiàn)了Java對(duì)象與JSON字符串之間的轉(zhuǎn)換,你學(xué)會(huì)了嗎?
6. 注意事項(xiàng)
我們?cè)谶M(jìn)行JSON解析時(shí),需要注意以下幾個(gè)問(wèn)題:
- JSON字符串必須是有效的JSON格式,否則會(huì)導(dǎo)致解析失敗;
- Java類(lèi)中的屬性的名稱(chēng)和類(lèi)型,必須與JSON對(duì)象或JSON數(shù)組中的鍵和值相對(duì)應(yīng);
- JSON字符串中的鍵必須是字符串類(lèi)型,用雙引號(hào)包裹;
- Java類(lèi)中的屬性類(lèi)型必須與JSON字符串中的值類(lèi)型相對(duì)應(yīng);
- 使用Jackson進(jìn)行JSON解析時(shí),需要將JSON字符串的Unicode轉(zhuǎn)義符進(jìn)行轉(zhuǎn)義,例如將"\"轉(zhuǎn)換為"\\";
- JSON字符串中的鍵必須是唯一的,重復(fù)的鍵會(huì)被覆蓋;
- JSON字符串中的數(shù)組必須使用中括號(hào)包裹,并使用逗號(hào)分隔數(shù)組元素。
以上這些注意事項(xiàng),大家一定要認(rèn)真對(duì)待,否則可能會(huì)導(dǎo)致你出現(xiàn)一些莫名其妙的錯(cuò)誤哦。
四. 結(jié)語(yǔ)
在本文給大家詳細(xì)介紹了JSON解析的概念、原理和使用方法,并以Jackson為例進(jìn)行了詳細(xì)的實(shí)現(xiàn)。希望大家熟練掌握J(rèn)SON解析,因?yàn)檫@個(gè)技術(shù)實(shí)在是太常用了哦。在實(shí)際開(kāi)發(fā)中,我們要根據(jù)實(shí)際需求選擇合適的JSON解析方式,并根據(jù)具體的情況選擇相應(yīng)的注解,以便讓JSON解析更加得便捷和高效。
以上就是詳解如何使用Java進(jìn)行JSON解析的詳細(xì)內(nèi)容,更多關(guān)于Java進(jìn)行JSON解析的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot整合第三方技術(shù)的實(shí)現(xiàn)
本文主要介紹了SpringBoot整合第三方技術(shù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02SpringBoot集成Kafka 配置工具類(lèi)的詳細(xì)代碼
spring-kafka 是基于 java版的 kafka client與spring的集成,提供了 KafkaTemplate,封裝了各種方法,方便操作,它封裝了apache的kafka-client,不需要再導(dǎo)入client依賴(lài),這篇文章主要介紹了SpringBoot集成Kafka 配置工具類(lèi),需要的朋友可以參考下2022-09-09Java關(guān)鍵字this(動(dòng)力節(jié)點(diǎn)Java學(xué)院整理)
java中的this隨處可見(jiàn),用法也多。通常情況下理解this關(guān)鍵字還是很容易的,但是在我初學(xué)的時(shí)候,有一個(gè)疑問(wèn)卻一直不能很清晰的理解,現(xiàn)在慢慢的理解了,下面通過(guò)本文給大家記錄下,有需要的朋友參考下2017-03-03Java生成PDF文檔兩個(gè)超實(shí)用的庫(kù)( iText和Apache PDFBox)
這篇文章主要介紹了Java生成PDF文檔兩個(gè)超實(shí)用的庫(kù),分別是用 iText庫(kù)以及用Apache PDFBox庫(kù)生成PDF,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-02-02給Java菜鳥(niǎo)的一些建議_關(guān)于Java知識(shí)點(diǎn)歸納(J2EE and Web 部分)
下面小編就為大家?guī)?lái)一篇給Java菜鳥(niǎo)的一些建議_關(guān)于Java知識(shí)點(diǎn)歸納(J2EE and Web 部分)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05