Python-Jsonpath


 

 python解析json時使用jsonpath包

Xpath JSONPath 描述
/ $ 跟節點
. @ 現行節點
/ . or [] 取子節點
.. n/a 就是不管位置,選擇所有符合條件的條件
* * 匹配所有元素節點
[] [] 迭代器標示(可以在里面做簡單的迭代操作,如數組下標,根據內容選值等)
&#124 [,] 支持迭代器中做多選
[] ?() 支持過濾操作
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])


免責聲明!

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



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