成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

強大!JSON解析神器,再復雜也不怕了

開發(fā) 開發(fā)工具
當你面對一個嵌套層級很多、結構復雜的JSON對象時,你是否覺得逐一創(chuàng)建對應的Java實體類(或者是Map)來接收這些數(shù)據(jù)既繁瑣又低效?

環(huán)境:SpringBoot3.4.0

1. 簡介

你是否遇到過需要從一個復雜的JSON結構中提取特定信息的場景?

當你面對一個嵌套層級很多、結構復雜的JSON對象時,你是否覺得逐一創(chuàng)建對應的Java實體類(或者是Map)來接收這些數(shù)據(jù)既繁瑣又低效?

在進行單元測試或模擬請求時,你是否需要構建或修改JSON數(shù)據(jù)?

在測試過程中,我們可能需要構建特定的JSON請求體或修改響應數(shù)據(jù)。有沒有一種工具可以幫助我們輕松地完成這些操作?

答案是肯定的!有一種名為JSONPath的工具,它提供了一種類似于XPath的表達式語言,用于在JSON文檔中查詢和操作數(shù)據(jù)。JSONPath不僅能夠高效地定位和提取JSON中的特定信息,還支持數(shù)據(jù)過濾、轉換和更新等操作。

2. 實戰(zhàn)案例

2.1 準備環(huán)境

<dependency>
  <groupId>com.jayway.jsonpath</groupId>
  <artifactId>json-path</artifactId>
</dependency>

如果你是基于Spring Boot環(huán)境,那么你不需要指定版本,Spring Boot已經(jīng)幫我們管理了該組件的版本。截至撰寫該篇文章時,JSONPath的最新版本是2.9.0。

說明:JsonPath表達式總是以與XPath表達式在XML文檔中結合使用相同的方式來引用JSON結構。在JsonPath中,“根成員對象”無論是對象還是數(shù)組,總是被引用為$。

2.2 語法介紹

JsonPath 表達式可以使用點符號"."

$.store.book[0].title

也可以使用括號表示法

$['store']['book'][0]['title']

操作符

操作

說明

$

查詢的根元素,所有路徑表達式的起點

@

由過濾器謂詞處理的當前節(jié)點

*

通配符,在需要名稱或數(shù)字的位置可用

..

深度掃描,在需要名稱的位置可用

.<name>

點表示法的子節(jié)點

['<name>' (, '<name>')]

方括號表示法的子節(jié)點或子節(jié)點集合

[<number> (, <number>)]

數(shù)組索引或索引集合

[start:end]

數(shù)組切片操作符

[?(<expression>)]

過濾器表達式,表達式必須計算為布爾值

函數(shù)

函數(shù)可以在路徑的末尾被調用——函數(shù)的輸入是路徑表達式的輸出。函數(shù)的輸出由函數(shù)本身決定。支持如下的函數(shù):

過濾操作

過濾器是用于篩選數(shù)組的邏輯表達式。一個典型的過濾器可能是[?(@.age > 18)],其中@代表當前正在處理的項。可以使用邏輯運算符&&和||創(chuàng)建更復雜的過濾器。字符串字面量必須用單引號或雙引號括起來(例如[?(@.color == 'blue')]或[?(@.color == "blue")])。支持如下過濾:

操作符

說明

==

左值等于右值(注意1不等于'1')

!=

左值不等于右值

<

左值小于右值

<=

左值小于或等于右值

>

左值大于右值

>=

左值大于或等于右值

=~

左值匹配正則表達式 [?(@.name =~ /foo.*?/i)]

in

左值存在于右值中 [?(@.size in ['S', 'M'])]

nin

左值不存在于右值中

subsetof

左值是右值的子集 [?(@.sizes subsetof ['S', 'M', 'L'])]

anyof

左值與右值有交集 [?(@.sizes anyof ['M', 'L'])]

noneof

左值與右值無交集 [?(@.sizes noneof ['M', 'L'])]

size

左值(數(shù)組或字符串)的大小應與右值匹配

empty

左值(數(shù)組或字符串)應為空

接下來,我們介紹具體的使用示例。

2.3 使用示例

準備json數(shù)據(jù)

{
  "store": {
    "book": [
      {
        "category": "Java",
        "author": "張三",
        "title": "Java從入門到放棄",
        "price": 88.6
      },
      {
        "category": "Spring",
        "author": "Pack",
        "title": "Spring從入門到精通",
        "price": 99.8
      },
      {
        "category": "Java",
        "author": "李四",
        "title": "多線程并發(fā)編程",
        "isbn": "1-9527-6688-9",
        "price": 66.9
      },
      {
        "category": "Spring",
        "author": "Pack",
        "title": "Spring Boot3實戰(zhàn)案例100講",
        "isbn": "6-9527-7799-2",
        "price": 70
      }
    ],
    "bicycle": {
      "color": "red",
      "price": 666
    }
  },
  "expensive": 10
}

層級格式如下:

接下來,我們將在代碼中通過jsonpath來操作上面的json數(shù)據(jù)。

讀取json內容

String json = new ClassPathResource("data.json")
  .getContentAsString(StandardCharsets.UTF_8) ;

下面都將基于上面讀取到的json數(shù)據(jù)進行操作。

獲取所有圖書的作者

List<String> list = JsonPath.parse(json).read("$.store.book[*].author");
System.err.println("Authors: " + list) ;
// 輸出結果
Authors: ["張三","Pack","李四","Pack"]

獲取所有作者

List<String> list = JsonPath.parse(json).read("$..author") ;
System.err.println("Authors: " + list) ;
// 輸出結果
Authors: ["張三","Pack","李四","Pack"]

獲取store節(jié)點下的所有數(shù)據(jù)

Object result = JsonPath.parse(json).read("$.store.*") ;
System.err.println(result) ;

輸出結果如下:

類型是:net.minidev.json.JSONArray

獲取所有價格price

/**獲取store節(jié)點下的所有price*/
List<Double> prices = JsonPath.parse(json).read("$.store..price") ;
System.err.println(prices) ;
// 輸出結果
[88.6,99.8,66.9,70,666]

獲取指定索引的書

/**獲取第三本書*/
Object result = JsonPath.parse(json).read("$..book[2]") ;
System.err.println(result) ;
/**輸出結果; 類型:net.minidev.json.JSONArray*/
[{"category":"Java","author":"李四","title":"多線程并發(fā)編程","isbn":"1-9527-6688-9","price":66.9}]


result = JsonPath.parse(json).read("$..book[0,1]") ;
System.err.println(result) ;
// 輸出結果
[
  {"category":"Java","author":"張三","title":"Java從入門到放棄","price":88.6},
  {"category":"Spring","author":"Pack","title":"Spring從入門到精通","price":99.8}
]

所有帶有ISBN編號的書

/**所有帶有ISBN編號的書*/
Object result = JsonPath.parse(json).read("$..book[?(@.isbn)]") ;
System.err.println(result) ;
// 輸出結果
[
  {"category":"Java","author":"李四","title":"多線程并發(fā)編程","isbn":"1-9527-6688-9","price":66.9},
  {"category":"Spring","author":"Pack","title":"Spring Boot3實戰(zhàn)案例100講","isbn":"6-9527-7799-2","price":70}
]

獲取所有價格小于70元的圖書

/**獲取所有價格小于70元的圖書*/
Object result = JsonPath.parse(json).read("$.store.book[?(@.price < 70)]") ;
System.err.println(result) ;
// 輸出結果
[
  {"category":"Java","author":"李四","title":"多線程并發(fā)編程","isbn":"1-9527-6688-9","price":66.9}
]

獲取圖書的個數(shù)

// 獲取圖書的個數(shù)
Integer count = JsonPath.parse(json).read("$..book.length()") ;
System.err.println(count) ;
// 輸出結果
4

自定義過濾條件

import static com.jayway.jsonpath.Criteria.where;
import static com.jayway.jsonpath.Filter.filter;
// 自定義filter
Filter cheapFictionFilter = filter(
    where("category").is("Java").and("price").lte(70D)
  );
List<Map<String, Object>> books = JsonPath.parse(json).read("$.store.book[?]", cheapFictionFilter);
System.err.println(books) ;
// 輸出結果
[
  {"category":"Java","author":"李四","title":"多線程并發(fā)編程","isbn":"1-9527-6688-9","price":66.9}
]

修改數(shù)據(jù)

// 修改數(shù)據(jù)
String newJson = JsonPath.parse(json)
  .set("$['store']['book'][0]['author']", "pack_xg")
  .jsonString();
System.out.println(newJson) ;

輸出結果:

圖片圖片

責任編輯:武曉燕 來源: Spring全家桶實戰(zhàn)案例源碼
相關推薦

2021-08-05 23:04:51

iPhone手機定位

2010-05-25 11:41:36

數(shù)據(jù)中心布線問題

2010-09-16 11:07:28

裁員

2019-04-08 08:25:48

代碼開發(fā)工具

2019-07-16 13:02:26

BugDebug代碼

2023-02-28 17:27:02

分庫分表中間件

2019-06-17 05:03:37

memcache內核架構

2022-07-11 07:36:36

緩存緩存雪崩緩存擊穿

2023-08-06 12:50:19

機器人AI

2010-03-05 08:54:14

Windows 7試用版升級

2022-02-18 18:00:00

數(shù)字人人工智能冬奧黑科技

2019-04-01 05:02:48

搜索架構檢索

2021-07-15 07:23:25

MySQL故障索引

2014-11-12 09:58:48

2014-11-04 10:02:33

2010-05-18 15:36:59

IIS服務器

2021-10-11 07:46:50

ScalaJVM語言

2021-03-19 09:55:15

Linuxshell命令

2020-05-07 16:08:28

Linuxshell命令

2019-10-11 11:00:53

Nginx神器前端
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产玖玖 | 亚洲一区二区在线免费观看 | 国产美女久久久 | 久久精品伊人 | 天天色图 | 青青草久久 | 成人毛片网 | 福利视频亚洲 | 欧美一区二区三区在线观看视频 | 国产精品久久久久久亚洲调教 | 欧美日韩成人在线观看 | 亚州国产 | 99免费在线观看视频 | 欧美日韩国产中文 | 国产免费一区 | a免费视频| 伊人免费观看视频 | 天天射天天操天天干 | 日本激情一区二区 | 999精品视频在线观看 | 精品视频在线免费观看 | 一区二区精品电影 | 日韩1区| 日韩视频成人 | 一级大黄| 91中文在线观看 | 久久久久久色 | 男人的天堂亚洲 | 播放一级黄色片 | 911精品国产 | 亚洲视频免费在线观看 | av天天看| 免费黄色片在线观看 | 日韩中文一区二区三区 | 亚洲精品一区二区三区蜜桃久 | 国产精品美女久久久久aⅴ国产馆 | 男女在线网站 | www久久久| 欧美不卡一区二区三区 | 一区二区三区影院 | 欧美一级片在线看 |