🍔經過文件將字典轉成字符串存入(序列化) dic = {'name':'egon','age':18} with open('db.txt','w',encoding='utf-8')as f : f.write(str(dic)) 🍔經過"eval"函數將拿出來的字符串轉成數據結構(反序列化) with open('db.txt','r',encoding='utf-8')as f: data = f.read() dic = eval(data) print(dic) # {'name': 'egon', 'age': 18} print(type(dic)) # <class 'dict'>
x="[null,true,false,1]" print(eval(x)) # 報錯,沒法解析null類型
把某個語言的變量轉成 json 格式字符串html
內存中的數據結構----->轉成一種中間格式(字符串)----->存到文件中前端
把 json 格式字符串轉成某個語言的變量java
文件----->讀取中間格式(字符串)----->eval( ) 轉成內存中數據結構python
序列化兩種用途:編程
存取數據 (格式標準), 一個程序寫入, 另外一個程序讀取 (這兩個程序能夠是使用不一樣的語言寫的)
例如 : 後端給前端的數據就是 "json" 格式字符串
json 模塊能夠序列化:字典,列表,布爾json
json 數據類型和 python 數據類型對應關係表後端
Json類型 | Python類型 |
---|---|
{} | dict |
[] | list |
"string" | str |
1.73 | int或float |
true/false | True/False |
null | None |
dic = {'movieIds': [111, 222, 333, 444],\ 'stids': [{'movieId': 11, 'stid': 1}, \ {'movieId': 22, 'stid': 2}, \ {'movieId': 33, 'stid': 3}]} res = json.dumps(dic) print(res) '''能夠發現對應格式已經發生了轉變 {"movieIds": [111, 222, 333, 444],\ "stids": [{"movieId": 11, "stid": 1},{"movieId": 22, "stid": 2}, {"movieId": 33, "stid": 3}]} '''
import json dic = {"name":"song"} print(json.dumps(dic)) # {"name": "song"} s = '{"name": "song"}' print(json.loads(s)) # {'name': 'song'}
.dumps()
import json dic = {'name':'song','age':21} dic = json.dumps(dic) print(dic,type(dic)) # {"name": "song", "age": 21} <class 'str'> with open('db.json','a',encoding='utf-8')as f: f.write(dic)
.loads()
with open('db.json', 'rt', encoding='utf-8')as f: data = f.read() dic = json.loads(data) print(dic, type(dic)) # {'name': 'song', 'age': 21} <class 'dict'>
.dump()
import json dic = {'name':'song','age':21} with open('db1.json','wt',encoding='utf-8')as f: json.dump(dic,f)
.load()
with open('db1.json','rt',encoding='utf-8')as f: dic = json.load(f) print(dic,dic['age']) # {'name': 'song', 'age': 21} 21
import json dic = {"name": "派大星", "age": 22} res = json.dumps(dic) print(res) # {"name": "\u6d3e\u5927\u661f", "age": 22}
ensure_ascii=False
功能dic = {"name": "派大星", "age": 22} res = json.dumps(dic,ensure_ascii=False) print(res) # {"name": "派大星", "age": 22}
並無使用上的變化, 存的是什麼, 取出來的仍是什麼, 只不過人家內部幫你轉成"uncode"格式保存
ps : java中,出於性能的考慮,有不少包來完成序列化和反序列化:谷歌的gson 阿里開源fastjson 等等網絡