一、說明
1.1 背景說明
json對象與string相互轉換,這東西想寫了很多次,但總覺得網上教程比較成熟,所以之前每次都放棄了。但今天又被string轉json對象折騰了半天,實在受不了,所以還是要寫一寫。
1.2 問題明確
首先要明確,python里有json這個庫,但並沒有json這個類,所以所謂的json對象本質上就是一個dict;而json這個庫,用於實現dict到string、string到dict的互轉。
更具體一點,json對象(dict)轉string用json.dumps(),string轉json對象(dict)用json.loads()。(另外dump()是json輸出到文件,load()是從文件載入成json。)
對於哪個轉哪個用哪個常弄混的問題,可以這么理解:以json為參照點,loads是向載入的動作靠向json所以是string轉成json對象,所以dumps是從取出的動作遠離json所以是json對象轉成string。
二、json對象(dict)轉string
2.1 簡單地直接轉換----使用json.dumps()
import json # 變量為dict類型,亦即所謂的json對象 json_dict = { "username": "root", "password": "toor" } # 變量為str類形,json對象轉成的字符串 # 值為'{"username": "root", "password": "toor"}' json_str = json.dumps(json_dict) # 注意如果將json_dict和json_str都使用print()直接打印出來,看不出什么區別,因為字符串類型變量print出來后最外層的引號會被脫掉 # 唯一的區別是,打印出來的json_dict鍵值都使用單引號,而json_str內層使用雙引號,外層使用單引號
2.2 更美觀地輸出
json對象或者說是dict類型變量是可以直接使用print()函數打印的,但只是那種所有key-value都打印在一行的形式。使用json.dumps()我們可以使用輸出成縮進形式。
import json # 變量為dict類型,亦即所謂的json對象 json_dict = { "username": "root", "password": "toor" } # 變量為str類形,json對象轉成的字符串 # 值為'{"username": "root", "password": "toor"}' # json_str = json.dumps(json_dict) # indent是縮進空格數,這里4表示使用4空格縮進 # 值為'{\n "username": "root", \n"password": "toor"\n}' json_str = json.dumps(json_dict, indent=4) print(json_str) # 也可以直接使用json.dump()寫到文件 # with open("test.txt", "r", encoding="utf-8") as fd: # json.dump(json_dict, fd, indent=4) # logging模塊也可以這樣轉換再打印實現縮進效果 # json_str = json.dumps(json_dict, indent=4) # logging.info(json_str)
三、string轉json對象(dict)
常規的string----指最外層是單引號,內層鍵值是雙引號,且最后一對鍵值之后沒有逗號的字符串。如'{"username": "root", "password": "toor"}'。
特殊的string----指最外層是雙引號,內層鍵值是單引號,或者最一對鍵值之后有逗號的字符串。如"{'username': 'root', 'password': 'toor'}"或'{"username": "root", "password": "toor",}'。
如下圖可以看到,對於特殊字符串如果強行使用json.loads()要將其轉換成json對象,那最外層雙引號或最后的逗號都會觸發報錯:ValueError: Expecting property name: line x column xx (char xx)
3.1 常規的string轉json對象(dict)----使用json.loads()
import json # 變量為str類形,待json對象的常規字符串 json_str = '{"username": "root", "password": "toor"}' # 變量為dict類型,亦即所謂的json對象 # {'username': 'root', 'password': 'toor'} json_dict = json.loads(json_str)
3.2 特殊的string轉json對象(dict)----使用ast.literal_eval()
import ast # 變量為str類形,待json對象的特殊字符串 json_str = "{'username': 'root', 'password': 'toor'}" # json_str = '{"username": "root", "password": "toor",}' # json_str = "{'username': 'root', 'password': 'toor',}" # 變量為dict類型,亦即所謂的json對象 # {'username': 'root', 'password': 'toor'} json_dict = ast.literal_eval(json_str)
參考:
https://stackoverflow.com/questions/3733554/how-to-format-dict-string-outputs-nicely