1. 程式人生 > 其它 >強大的Json解析工具 Jsonpath 實戰教程

強大的Json解析工具 Jsonpath 實戰教程

jsonpath

XML的優點是提供了大量的工具來分析、轉換和有選擇地從XML文件中提取資料。Xpath是這些功能強大的工具之一。

對於JSON資料來說,也出現了jsonpath這樣的工具來解決這些問題:

  • 資料可以通過互動方式從客戶端上的JSON結構提取,不需要特殊的指令碼。
  • 客戶端請求的JSON資料可以減少到伺服器的上的相關部分,從而大幅度減少伺服器響應的頻寬使用。

jsonpath表示式始終引用JSON結構的方式與Xpath表示式與XML文件使用的方式相同。

jsonpath的安裝方法

pipinstalljsonpath

jsonpath與Xpath

下面表格是jsonpath語法與Xpath的完整概述和比較。

Xpathjsonpath概述
/ $ 根節點
. @ 當前節點
/ .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格式的資料的一款工具,最重要的是這款工具輕量簡單容使用。