python解析json時使用jsonpath包
Xpath | JSONPath | 描述 |
---|---|---|
/ | $ | 跟節點 |
. | @ | 現行節點 |
/ | . or [] | 取子節點 |
.. | n/a | 就是不管位置,選擇所有符合條件的條件 |
* | * | 匹配所有元素節點 |
[] | [] | 迭代器標示(可以在里面做簡單的迭代操作,如數組下標,根據內容選值等) |
| | [,] | 支持迭代器中做多選 |
[] | ?() | 支持過濾操作 |
n/a | () | 支持表達式計算 |
() | n/a | 分組,JsonPath不支持 |
導入包
pip install jsonpath
使用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 }
loads方法是把json字符串轉化為python對象,dumps方法是把pyhon對象轉化為json字符串
如果是從文件中讀入的字符串則要先轉為python對象使用loads方法,
import json import jsonpath as jp f='' for line in open('D:\VSpython\json\j1.txt', 'r'): #打開文件 rs = line.rstrip('\n') # 移除行尾換行符 f=f+rs str=json.loads(f)
現在對str使用jsonpath()方法解析數據,方法2個參數:一個是被解析的對象shop,一個是解析的路徑re
re='$..book[0].*' rst=jp.jsonpath(shop,re)
json結構表示:K:V
re解讀:
re='$.store.bicycle.color'
表示根下 store :V里面的bicyce bicyce:V的color
re='$..book'
表示根以下的K=book的鍵值對,返回來book的V即book:后面所有的字符,注意還包含[]數組的符號
re='$..book.*'
返回了book數組的所有的值,注意這次少了[]
re='$..book[0]'
因為book的V是個數組,所以book[0]表示該數組的一個值。
re='$..book[0].*'
表示數組第一個值里的所有V
re='$..book[0].price'
數組第一個值的price的V即
綜上:jsonpath()函數返回構建的re(構建的re為一個K)的V。
當沒有匹配的值是返回false。
完整示例
import json import jsonpath as jp data1 = {'foo': [{'baz': 'news'}, {'baz': 'music'}]} 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 } #ss=json.loads(shop) rows=len(shop["store"]["book"]) #用字典取 for i in range(0,rows): re='$..book['+str(i)+'].' rst=jp.jsonpath(shop,re) cc=rst[0] print(cc["title"]) #數組一個一個取得 #for i in range(0,rows): # re='$..book['+str(i)+'].*' # rst=jp.jsonpath(shop,re) # for j in range(0,len(rst)): # print(rst[j])