jsonpath 使用教程(快速處理dict的深度查詢)

一 簡介

  • JSONPath - 用於JSON的XPathpython

  • 用來解析多層嵌套的json數據;JsonPath 是一種信息抽取類庫,是從JSON文檔中抽取指定信息的工具.

 

二 安裝json

        安裝方法:pip install jsonpath
     
        官方文檔:http://goessner.net/articles/JsonPath
數組

 

三 強大之處工具

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


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

 

四 jsonpath表達式

  • 使用註釋
$.store.book[0].title 

 

  • 括號 -註釋
$['store']['book'][0]['title']

 

五 jsonpath與xpath的聯繫

  JSONPath語法元素與XPath對應的完整概述和並排比較。spa

Xpath JSONPath 描述
/ $ 跟節點
. @ 現行節點
/ . or [] 取子節點
.. n/a 就是無論位置,選擇全部符合條件的條件
* * 匹配全部元素節點
[] [] 迭代器標示(能夠在裏面作簡單的迭代操做,如數組下標,根據內容選值等)
&#124 [,] 支持迭代器中作多選
[] ?() 支持過濾操做
n/a () 支持表達式計算
() n/a 分組,JsonPath不支持

 

 

六 實例演示

{ "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
    }
  }
}

 

 

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結構的全部成員。

 

python使用示例.net

使用格式:code

jsonpath.jsonpath(匹配的字典,'jsonpath表達式')
 
如:res2= jsonpath.jsonpath(d,'$..name')  #找d字典下面全部的name對應的值,返回一個列表

 

 

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)
相關文章
相關標籤/搜索