欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java學(xué)習(xí)之如何進(jìn)行JSON解析

 更新時(shí)間:2023年12月15日 08:41:52   作者:一一哥Sun  
JSON(JavaScript?Object?Notation)是一種輕量級(jí)的數(shù)據(jù)交換格式,它算是JavaScript語(yǔ)言的一部分,與XML一樣都可以用于數(shù)據(jù)的存儲(chǔ)和傳輸,本文講給大家介紹如何進(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é),如下表所示:

****JSONXML
格式輕量、易讀冗長(zhǎng)、復(fù)雜
數(shù)據(jù)類(lèi)型數(shù)組、對(duì)象、字符串、數(shù)字、布爾數(shù)組、對(duì)象、字符串、數(shù)字、布爾
解析庫(kù)Jackson、GsonDOM、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)
\uXXXXUnicode代碼(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)

    本文主要介紹了SpringBoot整合第三方技術(shù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • 淺談Java中的可變參數(shù)

    淺談Java中的可變參數(shù)

    下面小編就為大家?guī)?lái)一篇淺談Java中的可變參數(shù)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-10-10
  • Java框架MyBatis接口編程過(guò)程解析

    Java框架MyBatis接口編程過(guò)程解析

    這篇文章主要介紹了Java框架MyBatis接口編程過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • java中VO的使用解析

    java中VO的使用解析

    這篇文章主要介紹了java中VO的使用解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • SpringBoot集成Kafka 配置工具類(lèi)的詳細(xì)代碼

    SpringBoot集成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-09
  • Java導(dǎo)出Word文檔的四種方法

    Java導(dǎo)出Word文檔的四種方法

    在日常的開(kāi)發(fā)工作中,我們時(shí)常會(huì)遇到導(dǎo)出Word文檔報(bào)表的需求,比如公司的財(cái)務(wù)報(bào)表、醫(yī)院的患者統(tǒng)計(jì)報(bào)表、電商平臺(tái)的銷(xiāo)售報(bào)表等等,所以本文給大家介紹了Java導(dǎo)出Word文檔的四種方法,并通過(guò)代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2025-03-03
  • Java關(guān)鍵字this(動(dòng)力節(jié)點(diǎn)Java學(xué)院整理)

    Java關(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-03
  • Java生成PDF文檔兩個(gè)超實(shí)用的庫(kù)( iText和Apache PDFBox)

    Java生成PDF文檔兩個(gè)超實(shí)用的庫(kù)( iText和Apache PDFBox)

    這篇文章主要介紹了Java生成PDF文檔兩個(gè)超實(shí)用的庫(kù),分別是用 iText庫(kù)以及用Apache PDFBox庫(kù)生成PDF,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-02-02
  • Java中使用JavaScript腳本的方法步驟

    Java中使用JavaScript腳本的方法步驟

    這篇文章主要介紹了Java中使用JavaScript腳本的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • 給Java菜鳥(niǎo)的一些建議_關(guān)于Java知識(shí)點(diǎn)歸納(J2EE and Web 部分)

    給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

最新評(píng)論