強大的Json解析工具 Jsonpath 實戰教程
jsonpath
XML的優點是提供了大量的工具來分析、轉換和有選擇地從XML文件中提取資料。Xpath是這些功能強大的工具之一。
對於JSON資料來說,也出現了jsonpath這樣的工具來解決這些問題:
- 資料可以通過互動方式從客戶端上的JSON結構提取,不需要特殊的指令碼。
- 客戶端請求的JSON資料可以減少到伺服器的上的相關部分,從而大幅度減少伺服器響應的頻寬使用。
jsonpath表示式始終引用JSON結構的方式與Xpath表示式與XML文件使用的方式相同。
jsonpath的安裝方法
pipinstalljsonpath
jsonpath與Xpath
下面表格是jsonpath語法與Xpath的完整概述和比較。
Xpath | jsonpath | 概述 |
---|---|---|
/ | $ | 根節點 |
. | @ | 當前節點 |
/ | .or[] | 取子節點 |
* | * | 匹配所有節點 |
[] | [] | 迭代器標識(如陣列下標,根據內容選值) |
// | ... | 不管在任何位置,選取符合條件的節點 |
n/a | [,] | 支援迭代器中多選 |
n/a | ?() | 支援過濾操作 |
n/a | () | 支援表示式計算 |
下面我們就通過幾個示例來學習jsonxpath的使用方法。
我們先來看下面這段json資料
{"store":{
"book":[
{"category":"reference",
"author":"NigelRees",
"title":"SayingsoftheCentury",
"price":8.95
},
{"category":"fiction",
"author":"EvelynWaugh",
"title":"SwordofHonour",
"price":12.99
},
{"category":"fiction",
"author":"HermanMelville",
"title":"MobyDick",
"isbn":"0-553-21311-3",
"price":8.99
},
{"category":"fiction",
"author":"J.R.R.Tolkien",
"title":"TheLordoftheRings",
"isbn":"0-395-19395-8",
"price":22.99
}
],
"bicycle":{
"color":"red",
"price":19.95
}
}
}
獲取符合條件的節點
假如我需要獲取到作者的名稱該怎麼樣寫呢?
如果通過Python的字典方法來獲取是非常麻煩的,所以在這裡我們可以選擇使用jsonpath.。
具體程式碼示例如下所示:
importjsonpath
author=jsonpath.jsonpath(data_json,'$.store.book[*].author')
print(author)
執行上面的程式碼你會發現,成功的獲取到了所有的作者名稱,並儲存在列表中。
或者還可以這樣寫:
importjsonpath
author=jsonpath.jsonpath(data_json,'$..author')
print(author)
['Nigel Rees', 'Evelyn Waugh', 'Herman Melville', 'J. R. R. Tolkien']
使用指定索引
還是使用上面的json資料,假如我現在需要獲取第三本書的價格。
third_book_price=jsonpath.jsonpath(data_json,'$.store.book[2].price')
print(third_book_price)
[8.99]
執行上面的程式碼,你會發現成功的獲取到了第三本書的價格。
使用過濾器
isbn_book=jsonpath.jsonpath(data_json,'$..book[?(@.isbn)]')
print(isbn_book)
print(type(isbn_book))
[{'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', 'isb
n': '0-395-19395-8', 'price': 22.99}]
<class 'list'>
通過執行上面的程式碼,你會發現,成功的將含有isbn編號的書籍過濾出來了。
同樣的道理,根據上面的例子,我們也可以將價格小於10元的書過濾出來。
book=jsonpath.jsonpath(data_json,'$..book[?(@.price<10)]')
print(book)
print(type(book))
[{'category': 'reference', 'author': 'Nigel Rees', 'title': 'Sayings of the Century', 'price': 8.95}, {'category': 'fiction', 'author': 'Herman Melville', 'title': 'Moby Dick', 'isbn': '0-553-21311-3', 'price'
: 8.99}]
<class 'list'>
通過執行上面的程式碼,你會發現這裡已經成功的將價格小於10元的書提取出來了。
jsonpath其實是非常適合用來獲取json格式的資料的一款工具,最重要的是這款工具輕量簡單容使用。