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()--Json轉Python物件
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()--Python轉json物件且寫入檔案
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不支援