🍖json 模塊

引入

1.eval( ) 函數

  • 內置函數 這一張中咱們介紹過了 eval( ) 函數, 他能夠將字符串轉成Python對象
  • 不過侷限性比較大, 只能運用於普通的數據類型, 遇到特殊的數據類型就無論用 了
  • eval( ) 的處理重點 : 執行一個字符串表達式, 並返回表達式的值

2.eval 函數存取數據示例

🍔經過文件將字典轉成字符串存入(序列化)
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'>

3.eval 的侷限性

x="[null,true,false,1]"
print(eval(x))  # 報錯,沒法解析null類型

一.什麼是序列化和反序列化

1.序列化

  • 把某個語言的變量轉成 json 格式字符串html

  • 內存中的數據結構----->轉成一種中間格式(字符串)----->存到文件中前端

2.反序列化

  • json 格式字符串轉成某個語言的變量java

  • 文件----->讀取中間格式(字符串)----->eval( ) 轉成內存中數據結構python

3.json 的標準格式字符串

  • {"name" : "shawn", "age" : 18, "local" : true, "xx" : null}
  • json格式字符串符號必須是雙引號

二.爲何要序列化

序列化兩種用途:編程

1.持久保持狀態

  • 一個軟件或程序的運行就是在處理一系列狀態的變化, 編程語言中, "狀態"會以各類各樣有結構的數據類型(或變量)保存在內存中
  • 而內存是沒法永久保存數據的, 當斷電或者是重啓程序, 內存中那些有結構的數據都會被清空
  • 那麼序列化就是在你機器在斷電或重啓以前將當前內存中的數據都保存到文件中去,下次執行程序能夠直接載入以前的數據, 而後繼續執行 (就至關於單機遊戲存檔)
存取數據 (格式標準), 一個程序寫入, 另外一個程序讀取 (這兩個程序能夠是使用不一樣的語言寫的)

2.跨平臺數據交互

  • 序列化以後, 不只能夠將序列化後的內容存入磁盤, 也能夠經過網絡傳輸到別的機器上
  • 若是發送和接收方都約定好使用同一種序列化的格式, 那麼便屏蔽了平臺和語言所帶來的的差別性, 實現了跨平臺數據交互
  • 反過來, 把數據(變量)內容從序列化的對象從新讀到內存中, 這就稱之爲反序列化
例如 : 後端給前端的數據就是 "json" 格式字符串

三. 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}]}
'''

四.json 序列化的使用

1.簡單用法

import json

dic = {"name":"song"}
print(json.dumps(dic))  # {"name": "song"}

s = '{"name": "song"}'
print(json.loads(s))  # {'name': 'song'}

2.寫入文件序列化與反序列化 (複雜)

  • 序列化 : .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'>

3.簡單序列化與反序列化 (提供直接寫入文件功能)

  • 序列化 : .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 等等網絡

六.pickle 模塊

pickle序列化與反序列化👈點我

相關文章
相關標籤/搜索