JSONPath 的介紹

JSONPath的起源

1. 起源背景

在討論JSONPath的起源之前,讓我們先了解JSONPath是什么。JSONPath 是一種查詢語言,用于從JSON(JavaScript Object Notation)數據結構中提取數據。它允許開發者通過類似于XPath的表達式來定位JSON對象中的元素。JSONPath的設計初衷是為了簡化從JSON文檔中提取數據的操作,特別是在處理復雜的數據結構時。

JSONPath最初是由 Stefan Goessner 在2007年左右提出的。Goessner是一位軟件工程師,他在工作中遇到了需要從復雜的JSON數據結構中提取信息的需求,而現有的解決方案(如XPath)對于JSON格式的支持并不理想。因此,他開發了JSONPath,以更直觀和靈活的方式來解決這個問題。

2. 靈感來源

雖然JSONPath的設計初衷是為了解決特定的問題,但它的一些基本概念和語法確實受到了XPath的啟發。XPath是用于XML文檔查詢的語言,它提供了一套豐富的表達式來選擇XML文檔中的節點。Goessner在開發JSONPath時,借鑒了XPath的一些設計理念,例如使用路徑表達式來定位數據,以及提供類似于XPath的選擇器功能。

3. 發展與應用

隨著JSON在Web開發中的廣泛應用,JSONPath作為一種輕量級的查詢語言,迅速得到了廣泛的應用。它不僅被用于客戶端JavaScript代碼中,還擴展到了服務器端語言(如Java、Python等)的庫中,使得開發者可以在各種環境中方便地處理JSON數據。

JSONPath的特點

  • 簡潔性:JSONPath表達式通常比XPath更簡潔,更易于理解和編寫。

  • 靈活性:它支持多種選擇器,如點運算符(.)、數組索引、通配符(*)、過濾器([?()])等,使得它能夠靈活地處理各種復雜的JSON結構。

  • 跨語言支持:由于JSONPath的簡潔性和高效性,它被許多編程語言和框架所支持,從而在多種開發環境中得到了廣泛的應用。

結論

JSONPath起源于對現有解決方案(特別是XPath對于XML)的不滿和改進需求,旨在為處理JSON數據提供一種更加直接和高效的方法。通過借鑒XPath的一些設計理念并針對JSON數據結構的特點進行優化,JSONPath成為了一種流行且有效的查詢語言,廣泛應用于現代Web開發和數據處理中。


JSONPath?的詳細介紹

以下是關于?JSONPath?的詳細介紹,涵蓋語法規則、常見用法、Python 實現及實用示例,在處理 JSON 數據時快速定位和提取所需內容:

1. JSONPath 簡介

  • 定位:類似于 XPath(用于 XML),JSONPath 是一種?JSON 數據查詢語言,用于通過路徑表達式定位 JSON 結構中的節點。

  • 應用場景

    • 從復雜嵌套的 JSON 中提取特定字段。

    • 篩選符合條件的數據(如價格大于 100 的商品)。

    • 動態解析 API 返回的 JSON 響應。


2. 核心語法規則

表達式說明
$根節點
.?或?[]子節點操作符(.?用于屬性名,[]?用于索引或屬性名)
*通配符,匹配所有元素或屬性
..遞歸下降,搜索所有層級的子節點
@當前節點(用于過濾表達式)
[,]多選操作符(如?[0,1]?或?['name','price']
[start:end:step]數組切片(類似 Python 列表切片)
?()過濾表達式(篩選符合條件的節點)

3. 常用表達式示例

示例 JSON

json

復制

{"store": {"book": [{ "category": "fiction", "title": "A Game of Thrones", "price": 25 },{ "category": "fiction", "title": "The Hobbit", "price": 15 },{ "category": "non-fiction", "title": "AI Handbook", "price": 40 }],"location": "New York"}
}
3.1 基礎查詢
表達式結果
$.store.book[0].title"A Game of Thrones"(第一本書的標題)
$.store.book[*].title所有書的標題?["A Game of Thrones", "The Hobbit", "AI Handbook"]
$..price所有價格?[25, 15, 40](遞歸搜索)
$.store.*所有子節點(book?數組和?location?字符串)
3.2 過濾查詢
表達式結果
$.store.book[?(@.price > 20)]價格大于 20 的書籍
$.store.book[?(@.category == 'fiction')].title分類為?fiction?的書籍標題?["A Game of Thrones", "The Hobbit"]
$.store.book[?(@.title contains 'Game')]標題包含 "Game" 的書籍
3.3 復雜操作
表達式結果
$.store.book[-1:]最后一本書?[{ "category": "non-fiction", ... }]
$.store.book[:2].title前兩本書的標題?["A Game of Thrones", "The Hobbit"]
$..book[0,2].title第 0 和第 2 本書的標題?["A Game of Thrones", "AI Handbook"]

4. Python 中的 JSONPath 實現

4.1 安裝庫

推薦使用?jsonpath-ng(功能全面):

bash

復制

pip install jsonpath-ng
4.2 基本用法

python

復制

from jsonpath_ng import parsedata = {"store": {"book": [{"category": "fiction", "title": "A Game of Thrones", "price": 25},{"category": "fiction", "title": "The Hobbit", "price": 15},{"category": "non-fiction", "title": "AI Handbook", "price": 40}],"location": "New York"}
}# 解析表達式
expr = parse("$.store.book[?(@.price > 20)].title")# 執行查詢
matches = [match.value for match in expr.find(data)]
print(matches)  # 輸出:['A Game of Thrones', 'AI Handbook']
4.3 其他 Python 庫
  • jsonpath:輕量級庫,語法略有差異。

    python

    復制

    import jsonpath
    result = jsonpath.jsonpath(data, "$..book[?(@.price>20)].title")

5. 實用場景示例

5.1 提取 API 響應中的特定字段

python

復制

import requests
from jsonpath_ng import parseresponse = requests.get('https://api.example.com/products').json()
expr = parse("$..products[?(@.stock > 0 && @.price < 100)].name")
names = [match.value for match in expr.find(response)]
5.2 過濾日志中的錯誤信息

json

復制

{"logs": [{ "level": "INFO", "message": "User logged in" },{ "level": "ERROR", "message": "Database connection failed" },{ "level": "WARNING", "message": "High memory usage" }]
}

python

復制

expr = parse("$.logs[?(@.level == 'ERROR')].message")
errors = [match.value for match in expr.find(log_data)]  # ["Database connection failed"]

6. JSONPath 工具

  • 在線測試工具

    • JSONPath Online Evaluator

    • JSONPath Expression Tester

  • 瀏覽器插件

    • JSONPath Finder(Chrome)


7. 注意事項

  1. 路徑區分大小寫:JSON 屬性名是大小寫敏感的。

  2. 索引從 0 開始:數組的第一個元素索引為?0

  3. 過濾表達式語法差異:不同庫的過濾語法可能略有不同(如?==?vs?eq)。

  4. 性能問題:對超大 JSON 數據謹慎使用遞歸?..

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/898638.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898638.shtml
英文地址,請注明出處:http://en.pswp.cn/news/898638.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【CSS文字漸變動畫】

CSS文字漸變動畫 HTML代碼CSS代碼效果圖 HTML代碼 <div class"title"><h1>今天是春分</h1><p>正是春天到來的日子&#xff0c;花都開了&#xff0c;小鳥也飛回來了&#xff0c;大山也綠了起來&#xff0c;空氣也有點嫩嫩的氣息了</p>…

Bitcoin Thunderbolt 內測通道開啟,加速比特幣交易新時代

比特幣作為全球領先的加密貨幣&#xff0c;一直占據著去中心化金融的核心地位。然而&#xff0c;隨著比特幣生態的不斷擴展&#xff0c;其交易速度和擴容問題逐漸成為制約發展的關鍵瓶頸。為解決這一難題&#xff0c; 比特幣雷電網絡&#xff08;Bitcoin Thunderbolt&#xff0…

Postgresql無法連接問題匯總

一. 數據庫服務未啟動 ?報錯信息&#xff1a; [postgresk8s-node2 ~]$ psql psql: could not connect to server: No such file or directoryIs the server running locally and acceptingconnections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"…

軟件工程之軟件驗證計劃Software Verification Plan

個人主頁&#xff1a;云納星辰懷自在 座右銘&#xff1a;“所謂堅持&#xff0c;就是覺得還有希望&#xff01;” 本文為基于ISO26262軟件驗證計劃模板&#xff0c;僅供參考。 軟件驗證計劃&#xff0c;包括&#xff1a; 1. 軟件需求驗證計劃 2. 軟件架構設計驗證計劃 3. 軟件單…

SpringBoot之如何集成SpringDoc最詳細文檔

文章目錄 一、概念解釋1、OpenAPI2、Swagger3、Springfox4、Springdoc5. 關系與區別 二、SpringDoc基本使用1、導包2、正常編寫代碼&#xff0c;不需要任何注解3、運行后訪問下面的鏈接即可 三、SpringDoc進階使用1、配置文檔信息2、配置文檔分組3、springdoc的配置參數**1. 基…

SpringBoot3+Vue3開發學生成績管理系統

系統介紹 此系統功能包含&#xff1a;首頁、課程管理、成績查詢、成績詳情、班級管理、專業管理、用戶管理等功能。用戶管理又細分為賬號管理、學生管理、教師管理、管理員管理。 基礎功能包含&#xff1a;登錄、退出、修改登錄人信息、修改登錄人密碼。 分為4種角色&#x…

康謀方案 | AVM合成數據仿真驗證方案

隨著自動駕駛技術的快速發展&#xff0c;仿真軟件在開發過程中扮演著越來越重要的角色。仿真傳感器與環境不僅能夠加速算法驗證&#xff0c;還能在安全可控的條件下進行復雜場景的重復測試。 本文將分享如何利用自動駕駛仿真軟件配置仿真傳感器與搭建仿真環境&#xff0c;并對…

深入解析 Java Stream API:從 List 到 Map 的優雅轉換!!!

&#x1f680; 深入解析 Java Stream API&#xff1a;從 List 到 Map 的優雅轉換 &#x1f527; 大家好&#xff01;&#x1f44b; 今天我們來聊聊 Java 8 中一個非常常見的操作&#xff1a;使用 Stream API 將 List 轉換為 Map。&#x1f389; 具體來說&#xff0c;我們將深入…

配置銀河麒麟V10高級服務器操作系統安裝vmware tools。在您的計算機上尚未找到用于此虛擬機的 VMwareTools。安裝將無法繼續。

配置銀河麒麟V10高級服務器操作系統安裝vmware tools 下載VMwareTools安裝包 通過網盤分享的文件&#xff1a;VMwareTools-10.3.25-20206839.tar.gz 鏈接: https://pan.baidu.com/s/1EgMcqbIEur4iyHu2l0v_gQ?pwdrc8m 提取碼: rc8m 通過工具上傳到指定目錄&#xff0c;然后切換…

突破 HTML 學習瓶頸:表格、列表與表單的學習進度(一)

HTML 學習之困&#xff0c;如何破局&#xff1f; 作為一名熱衷于網頁開發的博主&#xff0c;在 HTML 的學習道路上&#xff0c;我可謂是 “過關斬將”&#xff0c;但也遇到過不少 “硬茬”。起初&#xff0c;當我滿心歡喜地以為掌握了基本的 HTML 標簽&#xff0c;就能輕松搭建…

理一理Mysql日期

在 MySQL 數據庫中&#xff0c;關于日期和時間的類型主要有以下幾種&#xff1a; 1. **DATE**: 僅存儲日期部分&#xff0c;格式為 YYYY-MM-DD&#xff0c;例如 2023-10-31。 2. **TIME**: 僅存儲時間部分&#xff0c;格式為 HH:MM:SS&#xff0c;例如 14:30:00。 3. **DATE…

CEF 多進程模式時,注入函數,獲得交互信息

CEF 控制臺添加一函數,枚舉 注冊的供前端使用的CPP交互函數有哪些-CSDN博客 上篇文章,是在模擬環境,單進程中設置的,這篇文章,將其改到正常多進程環境中設置。 對應于工程中的 CEF_RENDER項目 一、多進程模式中,改寫 修改步驟 1、注入函數 client_app_render.cpp 在…

C++ 介紹STL底層一些數據結構

c 標準模板庫中&#xff0c;set和map的底層實現通常基于紅黑樹&#xff0c;然們都是平衡二叉搜索樹(Balanceed Binary Serach Tree&#xff09;的一種,這種結構保證了 插入&#xff0c;刪除&#xff0c;查找的時間復雜度為O(log n)比普通二叉搜索樹更高效。 set set<T>…

在 Kubernetes(k8s)部署過程中常見的問題

在 Kubernetes(k8s)部署過程中,常見的問題主要包括以下幾類,以下是具體示例及簡要說明: 1. 資源配額不足(Resource Quota) 現象:Pod 處于 Pending 狀態,事件日志顯示 Insufficient CPU/Memory。 原因: 節點(Node)資源不足,無法滿足 Pod 的 requests 或 limits。 命…

Android Window浮窗UI組件使用JetPack

目前接手的一個業務&#xff0c;應用不是用Activity/Fragment作為界面組件&#xff0c;而是用Window浮窗的形式顯示&#xff0c;并且浮窗有很多種類型&#xff0c;每一種類型對應一類業務。那么怎么使用Jatpack的相關特性來設計架構并提高開發效率呢&#xff1f;分下面幾個模塊…

基于WebRtc,GB28181,Rtsp/Rtmp,SIP,JT1078,H265/WEB融合視頻會議接入方案

智能融合視頻會議系統方案—多協議、多場景、全兼容的一站式視頻協作平臺 OvMeet,LiveMeet針對用戶?核心痛點實現功能與用戶價值 &#xff0c;Web平臺實現MCU多協議&#xff0c;H265/H264等不同編碼監控&#xff0c;直播&#xff0c;會議&#xff0c;調度資源統一融合在一套界…

深入淺出理解LLM PPO:基于verl框架的實現解析之一

1. 寫在前面 強化學習(Reinforcement Learning,RL)在大型語言模型(Large Language Model,LLM)的訓練中扮演著越來越重要的角色。特別是近端策略優化(Proximal Policy Optimization,PPO)算法,已成為對齊LLM與人類偏好的主流方法之一。本文將基于verl框架(很多復刻De…

卷積神經網絡 - 匯聚層

卷積神經網絡一般由卷積層、匯聚層和全連接層構成&#xff0c;本文我們來學習匯聚層。 匯聚層(Pooling Layer)也叫子采樣層(Subsampling Layer)&#xff0c;其作用是進 行特征選擇&#xff0c;降低特征數量&#xff0c;從而減少參數數量。 卷積層雖然可以顯著減少網絡中連接的…

vue使用element-ui自定義樣式思路分享【實操】

前言 在使用第三方組件時&#xff0c;有時候組件提供的默認樣式不滿足我們的實際需求&#xff0c;需要對默認樣式進行調整&#xff0c;這就需要用到樣式穿透。本篇文章以vue3使用element-ui的Tabs組件&#xff0c;對Tabs組件的添加按鈕樣式進行客制化為例。 確定需要修改的組…

【工具分享】vscode+deepseek的接入與使用

目錄 第一章 前言 第二章 獲取Deepseek APIKEY 2.1 登錄與充值 2.2 創建API key 第三章 vscode接入deepseek并使用 3.1 vscode接入deepseek 3.2 vscode使用deepseek 第一章 前言 deepseek剛出來時有一段時間余額無法充值&#xff0c;導致小編沒法給大家發完整的流程&…