0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

jsonpath庫(kù)中的常規(guī)功能介紹

Linux愛(ài)好者 ? 來(lái)源:Python大數(shù)據(jù)分析 ? 作者: 費(fèi)弗里 ? 2021-09-01 14:11 ? 次閱讀

1 簡(jiǎn)介

在日常使用Python的過(guò)程中,我們經(jīng)常會(huì)與json格式的數(shù)據(jù)打交道,尤其是那種嵌套結(jié)構(gòu)復(fù)雜的json數(shù)據(jù),從中抽取復(fù)雜結(jié)構(gòu)下鍵值對(duì)數(shù)據(jù)的過(guò)程枯燥且費(fèi)事。

而熟悉xpath的朋友都知道,對(duì)于xml格式類(lèi)型的具有層次結(jié)構(gòu)的數(shù)據(jù),我們可以通過(guò)編寫(xiě)xpath語(yǔ)句來(lái)靈活地提取出滿(mǎn)足某些結(jié)構(gòu)規(guī)則的數(shù)據(jù)。

類(lèi)似的,JSONPath也是用于從json數(shù)據(jù)中按照層次規(guī)則抽取數(shù)據(jù)的一種實(shí)用工具,在Python中我們可以使用jsonpath這個(gè)庫(kù)來(lái)實(shí)現(xiàn)JSONPath的功能。

2 在Python中使用JSONPath提取json數(shù)據(jù)jsonpath是一個(gè)第三方庫(kù),所以我們首先需要通過(guò)pip install jsonpath對(duì)其進(jìn)行安裝。

2.1 一個(gè)簡(jiǎn)單的例子安裝完成后,我們首先來(lái)看一個(gè)簡(jiǎn)單的例子,從而初探其使用方式:

這里使用到的示例json數(shù)據(jù)來(lái)自高德地圖步行導(dǎo)航接口,包含了從天安門(mén)廣場(chǎng)到西單大悅城的步行導(dǎo)航結(jié)果,原始數(shù)據(jù)如下,層次結(jié)構(gòu)較深:

f2beeac2-0ad0-11ec-911a-12bb97331649.png

假如我想要獲取其嵌套結(jié)構(gòu)中steps鍵值對(duì)下每段行程的耗時(shí)duration數(shù)據(jù),配合jsonpath就可以這樣做:

import json

from jsonpath import jsonpath

# 讀入示例json數(shù)據(jù)with open(‘json示例.json’, encoding=‘utf-8’) as j:

demo_json = json.loads(j.read())

# 配合JSONPath表達(dá)式提取數(shù)據(jù)

jsonpath(demo_json, ‘$..steps[*].duration’)

f2cab01e-0ad0-11ec-911a-12bb97331649.png

其中$..steps[*].duration就是我們用于描述數(shù)據(jù)位置規(guī)則的JSONPath語(yǔ)句,配合jsonpath()便可以提取出對(duì)應(yīng)信息,下面我們就來(lái)學(xué)習(xí)jsonpath中支持的常用JSONPath語(yǔ)法:

2.2 jsonpath中的常用JSONPath語(yǔ)法為了滿(mǎn)足日常提取數(shù)據(jù)的需求,JSONPath中設(shè)計(jì)了一系列語(yǔ)法規(guī)則來(lái)實(shí)現(xiàn)對(duì)目標(biāo)值的定位,其中常用的有:

「按位置選擇節(jié)點(diǎn)」

在jsonpath中主要有以下幾種按位置選擇節(jié)點(diǎn)的方式:

功能語(yǔ)法

根節(jié)點(diǎn)$

當(dāng)前節(jié)點(diǎn)@

子節(jié)點(diǎn)?;颍郏?/p>

任意子節(jié)點(diǎn)*

任意后代節(jié)點(diǎn)。。

讓我們來(lái)演示一下它們的一些用法:

# 提取所有duration鍵對(duì)應(yīng)值

jsonpath(demo_json, ‘$..duration’)

f2eb80dc-0ad0-11ec-911a-12bb97331649.png

# 提取所有steps鍵的子節(jié)點(diǎn)對(duì)應(yīng)instruction值

jsonpath(demo_json, ‘$..steps.*.instruction’)

f2f7c37e-0ad0-11ec-911a-12bb97331649.png

索引子節(jié)點(diǎn)」

有些時(shí)候我們需要在選擇過(guò)程中對(duì)子節(jié)點(diǎn)做多選或按位置選擇操作,就可以使用到j(luò)sonpath中的相關(guān)功能:

# 多選所有steps鍵的子節(jié)點(diǎn)對(duì)應(yīng)的instruction與action值

jsonpath(demo_json, ‘$..steps.*[instruction,action]’)

f323adb8-0ad0-11ec-911a-12bb97331649.png

# 選擇steps鍵的第0個(gè)子節(jié)點(diǎn)對(duì)應(yīng)的instruction與action值

jsonpath(demo_json, ‘$..steps[0][instruction,action]’)

# 選擇steps鍵的第1到3(不包括3)個(gè)子節(jié)點(diǎn)對(duì)應(yīng)的instruction與action值

jsonpath(demo_json, ‘$..steps[1:3][instruction,action]’)

# 配合@,選擇steps鍵的最后一個(gè)子節(jié)點(diǎn)對(duì)應(yīng)的instruction與action值

jsonpath(demo_json, ‘$..steps[(@.length-1)][instruction,action]’)

f3322294-0ad0-11ec-911a-12bb97331649.png

「條件篩選」

有些時(shí)候我們需要根據(jù)子節(jié)點(diǎn)的某些鍵值對(duì)值,對(duì)選擇的節(jié)點(diǎn)進(jìn)行篩選,在jsonpath中支持常用的==、!=、》、《等比較運(yùn)算符,以==比較符為例,這里配合@定位符從當(dāng)前節(jié)點(diǎn)提取子節(jié)點(diǎn),語(yǔ)法為?(@.鍵名 比較符 值):

# 找到所有steps子節(jié)點(diǎn)中orientation為“西”的

jsonpath(demo_json, ‘$..steps[?(@.orientation == “西”)]’)

f340b5e8-0ad0-11ec-911a-12bb97331649.png

而如果想要提取所有具有指定鍵的節(jié)點(diǎn),可以參考下面的例子:

# 找到所有具有polyline鍵的節(jié)點(diǎn)對(duì)應(yīng)的polyline與road鍵對(duì)應(yīng)值

jsonpath(demo_json, ‘$.。[?(@.polyline)][polyline,road]’)

f3559148-0ad0-11ec-911a-12bb97331649.png

2.3 返回結(jié)果的形式在前面的例子中,我們所有的返回結(jié)果直接就是提取到的滿(mǎn)足條件的結(jié)果,而jsonpath()中還提供了另一種特殊的結(jié)果返回形式,只需要設(shè)置參數(shù)result_type=None就可以改直接返回結(jié)果為返回每個(gè)結(jié)果的JSONPath表達(dá)式:

# 獲取結(jié)果的JSONPath表達(dá)式

jsonpath(demo_json, ‘$.。[?(@.polyline)][polyline,road]’, result_type=None)

f3c909b6-0ad0-11ec-911a-12bb97331649.png

以上介紹的均為jsonpath庫(kù)中的常規(guī)功能,可以滿(mǎn)足基礎(chǔ)的json數(shù)據(jù)提取需求,而除了jsonpath之外,還有其他具有更加豐富拓展功能的JSONPath類(lèi)的第三方庫(kù),可以幫助我們實(shí)現(xiàn)很多進(jìn)階靈活的操作。

編輯:jq

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    6837

    瀏覽量

    88754
  • XML
    XML
    +關(guān)注

    關(guān)注

    0

    文章

    187

    瀏覽量

    33023
  • python
    +關(guān)注

    關(guān)注

    55

    文章

    4774

    瀏覽量

    84386
  • JSON
    +關(guān)注

    關(guān)注

    0

    文章

    117

    瀏覽量

    6929

原文標(biāo)題:在 Python 中操縱 json 數(shù)據(jù)的最佳方式

文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛(ài)好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    電動(dòng)機(jī)的常規(guī)控制方法

    電動(dòng)機(jī)作為現(xiàn)代工業(yè)不可或缺的動(dòng)力源,其性能的穩(wěn)定性和控制的精確性直接關(guān)系到整個(gè)生產(chǎn)過(guò)程的效率和安全。因此,電動(dòng)機(jī)的常規(guī)控制成為了工業(yè)自動(dòng)化領(lǐng)域的重要研究方向。本文將從電動(dòng)機(jī)的常規(guī)控制方法、控制策略、控制系統(tǒng)以及控制技術(shù)的發(fā)展趨
    的頭像 發(fā)表于 06-28 18:14 ?1220次閱讀

    博途用戶(hù)自定義庫(kù)的使用-庫(kù)的編輯及管理

    前面兩篇文章我們介紹了項(xiàng)目庫(kù)及全局庫(kù)。項(xiàng)目庫(kù)沒(méi)有單獨(dú)的存放路徑,它隨項(xiàng)目創(chuàng)建而創(chuàng)建,隨項(xiàng)目保存而保存。全局庫(kù)有單獨(dú)的存放路徑,可被保存、歸檔
    的頭像 發(fā)表于 01-24 10:45 ?968次閱讀
    博途用戶(hù)自定義<b class='flag-5'>庫(kù)</b>的使用-<b class='flag-5'>庫(kù)</b>的編輯及管理

    Proteus元件庫(kù)的電阻元件介紹

    在Proteus元件庫(kù),電阻元件被稱(chēng)為Resistor。電阻是一種常用的電子元件,用于限制電流流動(dòng)的能力。它們通常用于各種電路,包括放大電路、濾波電路、穩(wěn)壓電路等等。在本文中,我們將對(duì)電阻
    的頭像 發(fā)表于 01-24 10:11 ?9271次閱讀

    Access數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)介紹

    電子發(fā)燒友網(wǎng)站提供《Access數(shù)據(jù)庫(kù)基礎(chǔ)知識(shí)介紹.pdf》資料免費(fèi)下載
    發(fā)表于 01-02 10:24 ?3次下載

    宏集方案 | 物聯(lián)網(wǎng)HMI的關(guān)鍵驅(qū)動(dòng)力—SCADA級(jí)功能庫(kù)和控件庫(kù)

    在這個(gè)數(shù)字化時(shí)代,物聯(lián)網(wǎng)HMI已成為連接人與設(shè)備之間的關(guān)鍵紐帶,為用戶(hù)提供直觀、智能的交互體驗(yàn),背后強(qiáng)大的關(guān)鍵驅(qū)動(dòng)力扮演著至關(guān)重要的角色,其中SCADA級(jí)功能庫(kù)和控件庫(kù)的引入成為了物聯(lián)網(wǎng)HMI設(shè)計(jì)和開(kāi)發(fā)的核心要素。
    的頭像 發(fā)表于 12-26 09:39 ?449次閱讀
    宏集方案 | 物聯(lián)網(wǎng)HMI的關(guān)鍵驅(qū)動(dòng)力—SCADA級(jí)<b class='flag-5'>功能</b><b class='flag-5'>庫(kù)</b>和控件<b class='flag-5'>庫(kù)</b>

    半孔板比常規(guī)pcb板多出什么流程

    半孔板是一種特殊的PCB板,相比于常規(guī)的PCB板,它在制造過(guò)程需要多出一些步驟和流程。在本文中,將介紹半孔板相較于常規(guī)PCB板所多出的流程。 首先,半孔板的制造流程與
    的頭像 發(fā)表于 12-25 16:13 ?833次閱讀

    博途用戶(hù)自定義庫(kù)的使用

    中經(jīng)常使用的函數(shù)/函數(shù)塊/數(shù)據(jù)類(lèi)型等存放到自定義庫(kù),方便自己使用及與別人共享。博途具有很強(qiáng)的庫(kù)管理功能,包括:庫(kù)版本管理,
    的頭像 發(fā)表于 12-25 10:08 ?862次閱讀
    博途用戶(hù)自定義<b class='flag-5'>庫(kù)</b>的使用

    orcad修改封裝怎么更新庫(kù)

    "Library",然后選擇"Library Manager"來(lái)打開(kāi)封裝庫(kù)管理器。 在封裝庫(kù)管理器,可以看到已經(jīng)安裝的庫(kù)以及庫(kù)的詳細(xì)信息。
    的頭像 發(fā)表于 12-20 09:59 ?3852次閱讀

    oracle數(shù)據(jù)庫(kù)的基本操作

    Oracle數(shù)據(jù)庫(kù)是一種關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS),廣泛應(yīng)用于企業(yè)級(jí)應(yīng)用。它具有強(qiáng)大的功能和靈活的配置選項(xiàng),可以滿(mǎn)足復(fù)雜的數(shù)據(jù)處理需求。本文將
    的頭像 發(fā)表于 12-06 10:14 ?641次閱讀

    oracle數(shù)據(jù)庫(kù)的使用方法

    Oracle數(shù)據(jù)庫(kù)是一種關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),它由Oracle公司開(kāi)發(fā)和維護(hù)。它提供了安全、可靠和高性能的數(shù)據(jù)庫(kù)管理解決方案,被廣泛應(yīng)用于企業(yè)級(jí)應(yīng)用和大型數(shù)據(jù)庫(kù)環(huán)境
    的頭像 發(fā)表于 12-06 10:10 ?1157次閱讀

    天線(xiàn)與饋線(xiàn)連接的2種常規(guī)方法介紹

    在安裝天線(xiàn)時(shí),天線(xiàn)和饋線(xiàn)的連接至關(guān)重要,它與天線(xiàn)的接收效果密切相關(guān)。本文將介紹2種常規(guī)的天線(xiàn)和饋線(xiàn)連接的安裝方式。
    的頭像 發(fā)表于 11-24 16:01 ?1817次閱讀
    天線(xiàn)與饋線(xiàn)連接的2種<b class='flag-5'>常規(guī)</b>方法<b class='flag-5'>介紹</b>

    python如何引入math庫(kù)

    等。在本文中,將詳細(xì)介紹如何引入math庫(kù),并且討論各種數(shù)學(xué)函數(shù)的應(yīng)用。 為了引入math庫(kù),我們可以使用以下代碼: import math 這個(gè)語(yǔ)句會(huì)將整個(gè)math庫(kù)引入到程序
    的頭像 發(fā)表于 11-22 11:03 ?3998次閱讀

    navicat怎么導(dǎo)出數(shù)據(jù)庫(kù)文件

    導(dǎo)出數(shù)據(jù)庫(kù)文件是數(shù)據(jù)庫(kù)管理的一個(gè)重要操作,而Navicat是一款流行的數(shù)據(jù)庫(kù)管理工具,具有強(qiáng)大的導(dǎo)出功能。在本文中,我將詳細(xì)
    的頭像 發(fā)表于 11-21 10:53 ?7798次閱讀

    mysql是一個(gè)什么類(lèi)型的數(shù)據(jù)庫(kù)

    強(qiáng)、易于使用和管理。在本文中,我們將詳盡、詳實(shí)、細(xì)致地介紹MySQL的功能、優(yōu)勢(shì)、架構(gòu)、語(yǔ)法等方面。 一、MySQL的功能: 數(shù)據(jù)庫(kù)管理:MySQL具備創(chuàng)建和管理數(shù)據(jù)
    的頭像 發(fā)表于 11-16 14:43 ?1649次閱讀

    汽車(chē)EE體系結(jié)構(gòu)功能介紹

    汽車(chē)EE體系結(jié)構(gòu)功能介紹
    發(fā)表于 11-15 11:37 ?371次閱讀