解析復雜的嵌套數據結構-jsonpath


JsonPath是一種簡單的方法來提取給定JSON文檔的部分內容。 JsonPath有許多編程語言,如Javascript,Python和PHP,Java。

JsonPath提供的json解析非常強大,它提供了類似正則表達式的語法,基本上可以滿足所有你想要獲得的json內容。

Json結構清晰,可讀性高,復雜度低,非常容易匹配,其結合方式類似Xpath,為了方便記憶
下表中列出了對應了JSONPath以及對應的XPath用法。

XPath JSONPath 描述
/ $ 根節點
. @ 現行節點
/ .or[] 取子節點
.. n/a 取父節點,Jsonpath未支持
// .. 就是不管位置,選擇所有符合條件的條件
* * 匹配所有元素節點
@ n/a 根據屬性訪問,Json不支持,因為Json是個Key-value遞歸結構,不需要屬性訪問。
[] [] 迭代器標示(可以在里邊做簡單的迭代操作,如數組下標,根據內容選值等)
\| [,] 支持迭代器中做多選。
[] ?() 支持過濾操作.
n/a () 支持表達式計算
() n/a 分組,JsonPath不支持

使用規則

JsonPath表達式可以使用點表示法

$.store.book [0].title

或括號表示法

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

前面我們提到了jsonpath目前支持多種語言,下面我們以Python為例子進行使用。

安裝

pip install jsonpath

使用方法

import jsonpath
res=jsonpath.jsonpath(dic_name,'$..key_name')

嵌套n層也能取到所有key_name信息,其中:$表示最外層的{},..表示模糊匹配,當傳入不存在的key_name時,程序會返回false.

XPath JSONPath 結果
/store/book/author $.store.book[*].author 商店里所有書籍的作者
//author $..author 所有作者
/store/* $.store.* 商店里的所有東西,都是一些書和一輛紅色的自行車。
/store//price $.store..price 商店里一切的價格。
//book[3] $..book[2] 第三本書
//book[last()] $..book[(@.length-1)]或者$..book[-1:] 最后一本書。
//book[position()<3] $..book[0,1]或者$..book[:2] 前兩本書
//book[isbn] $..book[?(@.isbn)] 使用isbn number過濾所有書籍
//book[price<10] $..book[?(@.price<10)] 過濾所有便宜10以上的書籍
//* $..* XML文檔中的所有元素。JSON結構的所有成員。

綜合案例

shop={
    "store": {
        "book": [
            {
                "category": "reference",
                "author": "Nigel Rees",
                "title": "Sayings of the Century",
                "price": 8.95
            },
            {
                "category": "fiction",
                "author": "Evelyn Waugh",
                "title": "Sword of Honour",
                "price": 12.99
            },
            {
                "category": "fiction",
                "author": "Herman Melville",
                "title": "Moby Dick",
                "isbn": "0-553-21311-3",
                "price": 8.99
            },
            {
                "category": "fiction",
                "author": "J. R. R. Tolkien",
                "title": "The Lord of the Rings",
                "isbn": "0-395-19395-8",
                "price": 22.99
            }
        ],
        "bicycle": {
            "color": "red",
            "price": 19.95
        }
    },
    "expensive": 10
}

import jsonpath
#商店里所有書籍的作者
author_list=jsonpath.jsonpath(shop,'$.store.book[*].author')
print(author_list) #['Nigel Rees', 'Evelyn Waugh', 'Herman Melville', 'J. R. R. Tolkien']

#返回所有的作者
author_list2=jsonpath.jsonpath(shop,'$..author')
print(author_list2) #['Nigel Rees', 'Evelyn Waugh', 'Herman Melville', 'J

#商店里的所有東西
category_dx=jsonpath.jsonpath(shop,'$.store.*')
print(category_dx)

#商店里一切的價格
store_price_list=jsonpath.jsonpath(shop,'$.store..price')
print(store_price_list) #[8.95, 12.99, 8.99, 22.99, 19.95]

#第三本書
book_3=jsonpath.jsonpath(shop,'$..book[2]')
print(book_3)

#最后一本書
num=len(jsonpath.jsonpath(shop,'$..book'))-1
book_last=jsonpath.jsonpath(shop,f'$..book[{num}]')
print(book_last)

#前兩本書
book_12=jsonpath.jsonpath(shop,f'$..book[0,1]')
print(book_12)

#過濾所有便宜10以上的書籍
book_lg10=jsonpath.jsonpath(shop,'$..book[?(@.price<10)]')
print(book_lg10)

#使用isbn number過濾所有書籍
book_lg10=jsonpath.jsonpath(shop,'$..book[?(@.isbn)]')
print(book_lg10)

參考資料

https://blog.csdn.net/xlengji/article/details/81023368
https://www.cnblogs.com/angle6-liu/p/10580792.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM