標籤:問題: 說明 www. .json value pre 選擇性參數 沒有 最好
說明:
#json是一種通用的資料類型,所有的語言都認識。
#k - v {}
#json串就是一個字串,不能根據key-value取值
#json可以轉成字典
#json串就是字串,可放在三引號中
校正json格式的網址:http://www.bejson.com/
那麼json怎麼轉成字典,用到模組json,可以import json
一、JSON 函數1、json.dumps:字典轉成json串(字串)
json.dumps(stus,indent=8,ensure_ascii=False) #將字典轉成json字串 ;indent 控制幾個縮排的;當字典中有中文的時候,需要寫ensure_ascii=False,不然json串裡面不顯示漢字。
2、json.loads:將json串轉成字典1)字典和json互相轉換:
import json #匯入json模組s = ‘‘‘ { "error_code": 0, "stu_info": [ { "id": 309, "name": "小白", "sex": "男", "age": 28, "addr": "河南省濟源市北海大道32號", "grade": "天蠍座", "phone": "18512572946", "gold": 100 }, { "id": 310, "name": "小白", "sex": "男", "age": 28, "addr": "河南省濟源市北海大道32號", "grade": "天蠍座", "phone": "18516572946", "gold": 100 } ]}‘‘‘res = json.loads(s) #將json串轉成字典print(res)print(type(res))stus = {‘xiaojun‘:‘123456‘,‘xiaohei‘:‘345346‘} #一個字典res2 = json.dumps(stus) #將字典轉成json串print(res2)print(type(res2))
2)字典轉成json串,然後寫入檔案
stus = {‘xiaojun‘:‘123456‘,‘xiaohei‘:‘345346‘,‘海龍‘:‘34535‘} #一個字典res2 = json.dumps(stus,indent=8,ensure_ascii=False) #將字典轉成json串print(res2)print(type(res2))with open(‘stus.json‘,‘w‘,encoding=‘utf-8‘) as f: #檔案的尾碼.json,這樣檔案裡面顯示的好看,有顏色區分。尾碼無所謂 f.write(res2)
檔案中看-實際帶有顏色:
{ "xiaohei": "345346", "海龍": "34535", "xiaojun": "123456"}
3)從檔案中讀取json串,轉成字典
with open(‘stus.json‘,‘r‘,encoding=‘utf-8‘)as f: content = f.read() #返回字串 user_dict = json.loads(content) #將json字串轉成字典print(user_dict)
3、json.load()與json.loads()的區別
兩個方法功能類似,選擇性參數也相同,最大的區別在於,json.load方法接受的輸入,即第一個參數,是包含json資料的檔案對象,如open方法的返回對象。
json.loads接受的輸入是json字串,而非檔案對象。
如果說你要操作檔案,可以直接用json.load
舉例:
json.loads()將檔案中的json轉成字典如下:
with open(‘stus.json‘,‘r‘,encoding=‘utf-8‘)as f: content = f.read() #返回字串 user_dict = json.loads(content) #json.loads接受的是字串contentprint(user_dict)
json.load()將檔案中的json轉成字典如下:
with open(‘stus.json‘,‘r‘,encoding=‘utf-8‘)as f: user_dic = json.load(f) #json.load接受的是檔案對象 print(user_dic)
4、json.dump()和json.dumps()區別
dump()第一個參數時字典對象,第二個參數是檔案對象,可以直接將轉換後的json資料寫入檔案;dumps的第一個參數是對象字典,其餘都是選擇性參數。
參數記錄如下:
ensure_ascii 預設為True,保證轉換後的json字串中全部是ascii字元,非ascii字元都會被轉義。如果資料中存在中文或其他非ascii字元,最好將ensure_ascii設定為False,保證輸出結果正常。
indent 縮排,預設為None,沒有縮排,設定為正整數時,輸出的格式將按照indent指定的半形空格數縮排,相當實用。
separators 設定分隔字元,預設的分隔字元是(‘,‘, ‘: ‘),如果需要自訂json中的分隔字元,例如調整冒號前後的空格數,可以按照(item_separator, key_separator)的形式設定。
sort_keys 預設為False,設為True時,輸出結果將按照字典中的key排序。
將字典轉成json串寫入檔案操作:
json.dumps()方式
stus = {‘xiaojun‘:‘123456‘,‘xiaohei‘:‘345346‘,‘海龍‘:‘34535‘}f = open(‘stus.json‘,‘w‘,encoding=‘utf-8‘)res = json.dumps(stus,indent=8,ensure_ascii=False) #轉換成json串f.write(res) #寫入檔案
json.dump()方式:
stus = {‘xiaojun‘:‘123456‘,‘xiaohei‘:‘345346‘,‘海龍‘:‘34535‘}f = open(‘stus.json‘,‘w‘,encoding=‘utf-8‘)json.dump(stus,f,indent=8,ensure_ascii=False) #json.dump第一個參數字典(stus),第二個參數檔案對象(f),這個不需要再寫入操作了,直接就寫進去了
以上:當你要把字典寫到檔案裡面,用dump比較好用。如果你不操作檔案,想存到資料庫裡面,不能用dump,還得用dumps.
不帶s都跟檔案相關,帶s的都跟字串相關。
問題:應用json.load/loads/dump/dumps方法時,檔案中的內容如果不是json格式會拋異常如下。
raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
原因:檔案中不是json格式,可用http://www.bejson.com/查詢是不是json格式,其中:檔案是空的不是json格式,1也是json格式,{}是json格式
如果起初檔案就是空的,可以寫個{}這樣就能正確解析json串了
處理json