一、Json模塊
JSON(JavaScript Object Notation)是一種輕量級的數據交換格式,它是的人們很容易的進行閱讀和編寫。同時也方便了機器進行解析和生成。適用於進行數據交互的場景,比如網站前台與后台之間的數據交互。
JSON和XML的比較可謂不相上下
1、json結構:對象和數組
- 對象:對象在js中表示為{}括起來的內容,數據結構為{key:value,key:value,...}的鍵值對的結構,在面向對象的語言中,key為對象的屬性,value為對應的屬性值,所以很容易理解,取值方法為對象.key獲取屬性值,這個屬性值的類型可以是數字、字符串、數組、對象這幾種。
- 數組:數組在js中是中括號[]括起來的內容,數據結構為["Python", "javascript", "C++",..],取值方式和所有語言中一樣,使用索引獲取,字段值的類型可以是數字、字符串、數組、對象幾種。
2、json數據的轉換
- **不能使用dict將json字符串轉換為字典
- **不能使用eval將json字符串轉換為字典,json中的null在python中無法識別,會當成變量處理
- loads():將json字符串轉換為python類型的,或自動將null轉換為None
- dumps():將python類型的數據轉換為json字符串,會自動將None轉換為null
data = {"name": "ming", "id": 18, "msg": None} json_data = '{"name":"Tom","id":19,"msg":null}'
json.loads()將json字符串轉換為python類型的,或自動將null轉換為None
resp = json.loads(json_data) print(type(resp), resp) #(<type 'dict'>, {u'msg': None, u'name': u'json', u'id': 19})
json.load() 讀取文件中json形式的字符串元素轉化成python類型
strList = json.load(open("listStr.json")) print(type(strList), strList) #(<type 'list'>, [{u'city': u'\u5317\u4eac'}, {u'name': u'python_list'}]) strDict = json.load(open("dictStr.json")) print(type(strDict), strDict) #(<type 'dict'>, {u'city': u'\u5317\u4eac', u'name': u'python_dict'})
json.dumps() 將python類型的數據轉換為json字符串,會自動將None轉換為null
req = json.dumps(data) print(type(req),req) # (<type 'str'>, '{"msg": null, "name": "python", "id": 18}')
json.dump() 將Python內置類型序列化為json對象后寫入文件
listStr = [{"city": "北京"}, {"name":"python_list"}] json.dump(listStr, open("listStr.json", "w"), ensure_ascii=False) dictStr = {"city": "北京", "name":"python_dict"} json.dump(dictStr, open("dictStr.json", "w"), ensure_ascii=False)
二,jsonpath
- JSONPath表達式始終以與XPath表達式與XML文檔結合使用的相同方式引用JSON結構。由於JSON結構通常是匿名的,並且不一定具有“根成員對象”,因此JSONPath假定$分配給外部對象的抽象名稱。[摘自官方文檔]
- JSONPath表達式可以使用點號-表示法:$.store.book[0].title
- 括號符號:$['store']['book'][0]['title']
- JSONPath允許通配符 *表示成員名稱和數組索引
JsonPath與XPath語法對比:
案例:
import jsonpath # 數據源: json_data = { "store": { "book": [ { "category": "reference", "author": "李白", "title": "Sayings of the Century", "price": 8.95 }, { "category": "fiction", "author": "杜甫", "title": "Sword of Honour", "price": 12.99 }, { "category": "fiction", "author": "白居易", "title": "Moby Dick", "isbn": "0-553-21311-3", "price": 8.99 }, { "category": "fiction", "author": "蘇軾", "title": "The Lord of the Rings", "isbn": "0-395-19395-8", "price": 22.99 } ], "bicycle": { "color": "red", "price": 19.95 } } } # 普通取值需要先看json數據,找到uname節點,如果沒有就會報錯 data1 = json_data["store"]["bicycle"]['color'] print(data1) #"red" # jsonpath取值不需要看json數據,直接通過..(..就表示全局檢索后面跟的屬性)全局搜索uname屬性,如果沒有返回FALSE data2 = jsonpath.jsonpath(json_data, "$..color") print(data2) #["red"] data3 = jsonpath.jsonpath(json_data, "$.store.bicycle.color") print(data3) #["red"] datas = jsonpath.jsonpath(json_data, "$..author") print(datas) #['李白', '杜甫', '白居易', '蘇軾']
注意事項:
json.loads()是把Json格式字符串解碼轉換成Python對象,如果在json.loads的時候出錯,要注意被解碼的Json字符的編碼。
如果傳入的字符串的編碼不是UTF-8的話,需要制定字符編碼的參數:encoding
dataDict = json.loads(jsonStrGBK);
- dataJsonStr是JSON字符串,假設其編碼本身是非UTF-8的話而是GBK的,那么上述代碼會導致出錯,改為對應的。
dataDict = json.loads(jsonStrGBK, encoding="GBK")
- 如果dataJsonStr通過encoding指定了合適的編碼,但是其中又包含了其它編碼的字符,則需要先去將dataJsonStr轉換為Unicode,然后再指定編碼格式調用json.loads()
dataJsonStrUni = data.JsonStr.decode("GB2312") dataDict = json.loads(dataJsontrUni, encoding="GB2312")
字符串編碼轉換
這是程序員最苦逼的地方,什么亂碼之類的幾乎都是由漢字引起的。
其實編碼問題很好搞定,只要記住一點:任何平台的任何編碼,都能和Unicode互相轉換。
UTF-8與GBK互相轉換,那就先把UTF-8轉換成Unicode,再從Unicode轉換成GBK,反之同理。
# 這是一個 UTF-8 編碼的字符串 utf8Str = "你好地球" # 1. 將 UTF-8 編碼的字符串 轉換成 Unicode 編碼 unicodeStr = utf8Str.decode("UTF-8") # 2. 再將 Unicode 編碼格式字符串 轉換成 GBK 編碼 gbkData = unicodeStr.encode("GBK") # 1. 再將 GBK 編碼格式字符串 轉化成 Unicode unicodeStr = gbkData.decode("gbk") # 2. 再將 Unicode 編碼格式字符串轉換成 UTF-8 utf8Str = unicodeStr.encode("UTF-8")
decode
的作用是將其它編碼的字符串轉換成Unicode編碼encode
的作用是將Unicode編碼轉換成其他編碼的字符串
感謝https://www.cnblogs.com/miqi1992/p/8081244.html
感謝https://www.cnblogs.com/miqi1992/p/8081244.html