1. 程式人生 > >json模組與jsonpath語法

json模組與jsonpath語法

1、json簡介

JSON(JavaScript Object Notation) 是一種輕量級的資料交換格式,它使得人們很容易的進行閱讀和編寫。同時也方便了機器進行解析和生成。適用於進行資料互動的場景,比如網站前臺與後臺之間的資料互動。

JSON和XML的比較可謂不相上下。

Python 2.7中自帶了JSON模組,直接importjson就可以使用了。

json簡單說就是javascript中的物件和陣列,所以這兩種結構就是物件和陣列兩種結構,通過這兩種結構可以表示各種複雜的結構:

    物件:物件在js中表示為{ }括起來的內容,資料結構為 { key:value, key:value, ... }的鍵值對的結構,在面向物件的語言中,key為物件的屬性,value為對應的屬性值,所以很容易理解,取值方法為 物件.key 獲取屬性值,這個屬性值的型別可以是數字、字串、陣列、物件這幾種。

     陣列:陣列在js中是中括號[ ]括起來的內容,資料結構為 ["Python","javascript", "C++", ...],取值方式和所有語言中一樣,使用索引獲取,欄位值的型別可以是數字、字串、陣列、物件幾種。

2、json模組

json模組提供了四個功能:dumps、dump、loads、load,用於字串 和 python資料型別間進行轉換

#json.loads()--JsonPython物件

import json

#json資料型別
str_list = '[1, 2, 3, 4]'print(type(str_list))
print(str_list)

#轉換成python
裡面的列表
python_list = json.loads(str_list) # [1, 2, 3, 4] print(type(python_list)) print(python_list)
json.dumps()--python轉json字串

import json
import chardet

list_str = [1, 2, 3, 4]
tuple_str = (1, 2, 3, 4)
dict_str = {"city": "北京", "name": "大貓"}
print(type(list_str))#<class 'list'>
print(list_str)#[1, 2, 3, 4]

str_list = json.dumps(list_str)# '[1, 2, 3, 4]' print(type(str_list))#<class 'str'> print(str_list)#[1, 2, 3, 4] str_tuple = json.dumps(tuple_str) print(type(str_tuple)) print(str_tuple)# '[1, 2, 3, 4]' # 注意:json.dumps() 序列化時預設使用的ascii編碼 # 新增引數 ensure_ascii=False 禁用ascii編碼,按utf-8編碼 # chardet.detect()返回字典, 其中confidence是檢測精確度 str_dict = json.dumps(dict_str) print(type(str_dict))#<class 'str'> print(str_dict)#{"name": "\u5927\u732b", "city": "\u5317\u4eac"} #檢查預設是用什麼編碼 encode = chardet.detect(str_dict.encode()) print(encode)#{'encoding': 'ascii', 'confidence': 1.0, 'language': ''} #設定使用utf-8編碼 print(json.dumps(dict_str, ensure_ascii=False) )# {"name": "大貓", "city": "北京"} str_dict = json.dumps(dict_str, ensure_ascii=False).encode() encode = chardet.detect(str_dict) print(encode)#{'encoding': 'utf-8', 'confidence': 0.938125, 'language': ''}
#json.dump()--Pythonjson物件寫入檔案
import json

list_str = [{"city": "北京"}, {"name": "大劉"}]
#儲存列表到list_str.json檔案中,並且以utf-8編碼
fw = open("list_str.json","w",encoding="utf-8")

json.dump(list_str, fw, ensure_ascii=False)

dict_str = {"city": "北京", "name": "大劉"}
#儲存字典到dict_str.json檔案中,並且以utf-8編碼
fw = open("dict_str.json","w",encoding="utf-8")
json.dump(dict_str,fw , ensure_ascii=False,)
#json.load()--json轉python型別且讀取檔案
import json

f = open("list_str.json","r",encoding="utf-8")
strList = json.load(f)
print(strList)#[{'city': '北京'}, {'name': '大劉'}]

strDict = json.load(open("dict_str.json",encoding="utf-8"))
print(strDict)#{'name': '大劉', 'city': '北京'}

3. JsonPath

JsonPath 是一種資訊抽取類庫和XPath類似的規則,是從JSON文件中抽取指定資訊的工具,提供多種語言實現版本,包括:Javascript,Python, PHP 和 Java

JsonPath 對於 JSON 來說,相當於 XPATH 對於 XML。

Json結構清晰,可讀性高,複雜度低,非常容易匹配,下表中對應了XPath的用法。

XPath

JSONPath

描述

/

$

根節點

.

@

現行節點

/

.or[]

取子節點

..

n/a

取父節點,Jsonpath未支援

//

..

就是不管位置,選擇所有符合條件的條件

*

*

匹配所有元素節點

@

n/a

根據屬性訪問,Json不支援,因為Json是個Key-value遞迴結構,不需要。

[]

[]

迭代器標示(可以在裡邊做簡單的迭代操作,如陣列下標,根據內容選值等)

|

[,]

支援迭代器中做多選。

[]

?()

支援過濾操作.

n/a

()

支援表示式計算

()

n/a

分組,JsonPath不支援