Java操作JsonPath的詳細(xì)指南
一、什么是 JSONPath
JSONPath 是一種在JSON數(shù)據(jù)中查詢信息的表達(dá)式語言,它允許用戶通過一種簡潔明了的語法來定位和提取JSON對象中的特定數(shù)據(jù)。與XML的XPath類似,JSONPath 提供了一種靈活且強(qiáng)大的方式來查詢JSON結(jié)構(gòu)中的數(shù)據(jù)。
二、JSONPath 基本語法
JSONPath 的語法相對簡單,但功能卻非常強(qiáng)大。以下是一些基本的語法規(guī)則:
- $:表示JSON數(shù)據(jù)的根對象。
- . 或 []:用于訪問對象的屬性或數(shù)組的元素。例如,.name或[‘name’] 都可以訪問根對象中的 ‘name’ 屬性。
- …:表示遞歸下降,用于查找所有級別的屬性。
- ?():應(yīng)用一個過濾表達(dá)式來過濾數(shù)組中的元素。例如,$?(@.age>18) 將選擇所有年齡大于18的對象。
- []:在屬性名或數(shù)組索引位置使用,表示選擇所有元素。例如,$.students[*].name 將選擇所有學(xué)生的名字。
- -1、0、1、n:用作數(shù)組索引時,表示從最后一個元素開始計數(shù)。例如,$.students[-1].name 將選擇最后一個學(xué)生的名字。

三、JSONPath 高級特性
除了基本語法之外,JSONPath 還提供了一些高級特性,使得數(shù)據(jù)查詢更加靈活和強(qiáng)大。
- 通配符與切片:你可以使用
*通配符來選擇所有屬性,或者使用切片語法(如[start:end:step])來選擇數(shù)組中的特定元素范圍。 - 函數(shù):JSONPath 支持一些內(nèi)置函數(shù),如
length()(獲取數(shù)組或字符串長度)、keys()(獲取對象所有鍵)等,這些函數(shù)可以在查詢中進(jìn)行更復(fù)雜的操作。 - 條件表達(dá)式:通過結(jié)合使用
?()和邏輯操作符(如&&、||),你可以構(gòu)建復(fù)雜的條件表達(dá)式來過濾數(shù)據(jù)。
四、JSONPath 應(yīng)用場景
JSONPath 在多個領(lǐng)域都有廣泛的應(yīng)用,包括但不限于:
- 數(shù)據(jù)驗(yàn)證:通過 JSONPath 表達(dá)式,你可以輕松地驗(yàn)證 JSON 數(shù)據(jù)的結(jié)構(gòu)和內(nèi)容是否符合預(yù)期。
- 數(shù)據(jù)提取與轉(zhuǎn)換:在處理大量 JSON 數(shù)據(jù)時,JSONPath 可以幫助你快速定位和提取所需信息,或者將數(shù)據(jù)轉(zhuǎn)換為其他格式。
- 自動化測試:在自動化測試中,你可以使用 JSONPath 來驗(yàn)證 API 響應(yīng)中的數(shù)據(jù)是否符合預(yù)期。
- 日志分析:對于包含 JSON 格式的日志文件,JSONPath 可以幫助你快速提取和分析關(guān)鍵信息。
Java操作JsonPath庫
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>2.7.0</version> <!-- 請檢查是否有更新的版本 -->
</dependency>import com.jayway.jsonpath.JsonPath;
public class JsonPathExample {
public static void main(String[] args) {
String json = "{\n" +
" \"store\": {\n" +
" \"book\": [\n" +
" {\n" +
" \"title\": \"Sword of Honour\",\n" +
" \"price\": 12.99\n" +
" },\n" +
" {\n" +
" \"title\": \"Moby Dick\",\n" +
" \"price\": 8.99\n" +
" },\n" +
" {\n" +
" \"title\": \"The Lord of the Rings\",\n" +
" \"price\": 22.99\n" +
" }\n" +
" ],\n" +
" \"bicycle\": {\n" +
" \"color\": \"red\",\n" +
" \"price\": 19.95\n" +
" }\n" +
" },\n" +
" \"expensive\": 10\n" +
"}\n";
// 提取所有的書名
String bookTitlesPath = "$.store.book[*].title";
Object bookTitles = JsonPath.read(json, bookTitlesPath);
System.out.println("Book Titles: " + bookTitles);
// 提取第一本書的價格
String firstBookPricePath = "$.store.book[0].price";
Object firstBookPrice = JsonPath.read(json, firstBookPricePath);
System.out.println("First Book Price: " + firstBookPrice);
// 提取價格大于10的書名
String expensiveBookTitlesPath = "$.store.book[?(@.price > 10)].title";
Object expensiveBookTitles = JsonPath.read(json, expensiveBookTitlesPath);
System.out.println("Expensive Book Titles: " + expensiveBookTitles);
}
}首先定義了一個JSON字符串json,然后使用JsonPath.read方法來執(zhí)行JSONPath查詢。分別查詢了所有的書名、第一本書的價格以及價格大于10的書名,并將結(jié)果打印出來。
下面是使用上述JSON數(shù)據(jù)的更多JSONPath用法:
提取bicycle的顏色
JSONPath 表達(dá)式: $.store.bicycle.color
String bicycleColorPath = "$.store.bicycle.color";
Object bicycleColor = JsonPath.read(json, bicycleColorPath);
System.out.println("Bicycle Color: " + bicycleColor);提取不是"Sword of Honour"的所有書名
為了提取不等于"Sword of Honour"的書名,我們可以使用!=操作符。但請注意,不是所有的JSONPath實(shí)現(xiàn)都支持這種比較操作。如果你的實(shí)現(xiàn)不支持,你可能需要在應(yīng)用層面進(jìn)行過濾。
假設(shè)我們的JSONPath庫支持這種比較,表達(dá)式可能類似于:
JSONPath 表達(dá)式: $.store.book[?(@.title != 'Sword of Honour')].title
String notSwordOfHonourPath = "$.store.book[?(@.title != 'Sword of Honour')].title";
Object notSwordOfHonourTitles = JsonPath.read(json, notSwordOfHonourPath);
System.out.println("Book Titles Not 'Sword of Honour': " + notSwordOfHonourTitles);提取最貴的書的價格
為了獲取最貴的書的價格,我們可以先獲取所有書的價格,然后在應(yīng)用層面找到最大值。但如果JSONPath實(shí)現(xiàn)支持,我們也可以直接在表達(dá)式中使用max()函數(shù)。
JSONPath 表達(dá)式(如果支持): $.store.book[*].price.max()
在標(biāo)準(zhǔn)的JsonPath中并不直接支持這樣的聚合函數(shù),因此你可能需要在Java代碼中處理這個問題:
String allPricesPath = "$.store.book[*].price";
List<Double> allPrices = JsonPath.read(json, allPricesPath);
double maxPrice = Collections.max(allPrices);
System.out.println("Maximum Book Price: " + maxPrice);檢查是否有價格超過20的書
JSONPath 本身不直接支持返回一個布爾值來表示是否存在滿足條件的元素,但你可以在獲取結(jié)果后判斷結(jié)果集合是否為空。
JSONPath 表達(dá)式: $.store.book[?(@.price > 20)]
String expensiveBooksPath = "$.store.book[?(@.price > 20)]";
Object expensiveBooks = JsonPath.read(json, expensiveBooksPath);
boolean hasExpensiveBooks = ((List<?>) expensiveBooks).size() > 0;
System.out.println("Has books priced over 20: " + hasExpensiveBooks);獲取bicycle的價格,并判斷其是否大于15
首先提取bicycle的價格,然后在Java代碼中做比較。
JSONPath 表達(dá)式: $.store.bicycle.price
String bicyclePricePath = "$.store.bicycle.price";
Object bicyclePriceObj = JsonPath.read(json, bicyclePricePath);
double bicyclePrice = Double.parseDouble(bicyclePriceObj.toString());
boolean isBicyclePriceGreaterThan15 = bicyclePrice > 15;
System.out.println("Is bicycle price greater than 15? " + isBicyclePriceGreaterThan15);由于JSONPath的具體實(shí)現(xiàn)可能有所不同,某些高級功能(如過濾、聚合等)可能不在所有實(shí)現(xiàn)中都可用。如果你使用的JsonPath庫不支持這些功能,你可能需要在Java代碼中實(shí)現(xiàn)相應(yīng)的邏輯。
到此這篇關(guān)于Java操作JsonPath的文章就介紹到這了,更多相關(guān)Java操作JsonPath內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java數(shù)據(jù)結(jié)構(gòu)與算法之noDups去除重復(fù)項(xiàng)算法示例
這篇文章主要介紹了java數(shù)據(jù)結(jié)構(gòu)與算法之noDups去除重復(fù)項(xiàng)算法實(shí)現(xiàn)技巧,程序代碼非常簡單,關(guān)鍵在于循環(huán)與判定,需要的朋友可以參考下2016-08-08
java進(jìn)行遠(yuǎn)程部署與調(diào)試及原理詳解
這篇文章主要介紹了java進(jìn)行遠(yuǎn)程部署與調(diào)試及原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12
Java springboot里注解大全和使用指南(最新整理)
在Java Spring Boot中,注解是簡化開發(fā)、提高效率的關(guān)鍵工具,這篇文章給大家介紹Java springboot里注解大全和使用指南,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2026-03-03
LeetCode?動態(tài)規(guī)劃之矩陣區(qū)域和詳情
這篇文章主要介紹了LeetCode?動態(tài)規(guī)劃之矩陣區(qū)域和詳情,文章基于Java的相關(guān)資料展開對LeetCode?動態(tài)規(guī)劃的詳細(xì)介紹,需要的小伙伴可以參考一下2022-04-04
idea插件篇之java內(nèi)存分析工具(JProfiler)的使用
這篇文章主要介紹了idea插件篇之java內(nèi)存分析工具(JProfiler),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
idea創(chuàng)建spring boot項(xiàng)目及java版本只能選擇17和21的問題
這篇文章主要介紹了idea創(chuàng)建spring boot項(xiàng)目及java版本只能選擇17和21的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-01-01
java數(shù)組實(shí)現(xiàn)隊(duì)列及環(huán)形隊(duì)列實(shí)現(xiàn)過程解析
這篇文章主要介紹了java數(shù)組實(shí)現(xiàn)隊(duì)列及環(huán)形隊(duì)列實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-10-10
Apache?SkyWalking?修復(fù)TTL?timer?失效bug詳解
這篇文章主要為大家介紹了Apache?SkyWalking?修復(fù)TTL?timer?失效bug詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09

