Python Json序列化與反序列化


  在python中,序列化可以理解為:把python的對象編碼轉換為json格式的字符串,反序列化可以理解為:把json格式字符串解碼為python數據對象在python的標准庫中,專門提供了json庫與pickle庫來處理這部分。

  json的dumps方法和loads方法,可實現數據的序列化和反序列化。具體來說,dumps方法,可將json格式數據序列為Python的相關的數據類型;loads方法則是相反,把python數據類型轉換為json相應的數據類型格式要求。在序列化時,中文漢字總是被轉換為unicode碼,在dumps函數中添加參數ensure_ascii=False即可解決。

 

  下面是json的序列化與反序列化:

  1、Json序列化如下:

1 import json 2 print (json.__all__)    #查看json庫的所有方法
3 ['dump', 'dumps', 'load', 'loads', 'JSONDecoder', 'JSONEncoder']

  未在dumps函數中添加參數ensure_ascii=False,結果如下:

 1 #coding: utf-8
 2 import json  3 
 4 dict = {'name':'zhangsan', 'age':33, 'address':'紅星路'}  5 print('未序列化前的數據類型為:', type(dict))  6 print('為序列化前的數據:', dict)  7 #對dict進行序列化的處理
 8 dict_xu = json.dumps(dict)    #直接進行序列化
 9 print('序列化后的數據類型為:', type(dict_xu)) 10 print('序列化后的數據為:', dict_xu) 11 
12 ----------------------------------------------------------------
13 未序列化前的數據類型為: <class 'dict'>
14 為序列化前的數據: {'name': 'zhangsan', 'address': '紅星路', 'age': 33} 15 序列化后的數據類型為: <class 'str'>
16 序列化后的數據為: {"name": "zhangsan", "address": "\u7ea2\u661f\u8def", "age": 33}

  在dumps函數中添加參數ensure_ascii=False,結果如下:

 

 1 #coding: utf-8
 2 import json  3 
 4 dict = {'name':'zhangsan', 'age':33, 'address':'紅星路'}  5 print('未序列化前的數據類型為:', type(dict))  6 print('為序列化前的數據:', dict)  7 #對dict進行序列化的處理
 8 dict_xu = json.dumps(dict,ensure_ascii=False)    #添加ensure_ascii=False進行序列化
 9 print('序列化后的數據類型為:', type(dict_xu)) 10 print('序列化后的數據為:', dict_xu) 11 -------------------------------------------------------------------
12 未序列化前的數據類型為: <class 'dict'>
13 為序列化前的數據: {'address': '紅星路', 'age': 33, 'name': 'zhangsan'} 14 序列化后的數據類型為: <class 'str'>
15 序列化后的數據為: {"address": "紅星路", "age": 33, "name": "zhangsan"}

 

  2、Json反序列化如下:

 1 #coding: utf-8
 2 import json  3 
 4 dict = {'name':'zhangsan', 'age':33, 'address':'紅星路'}  5 print('未序列化前的數據類型為:', type(dict))  6 print('為序列化前的數據:', dict)  7 #對dict進行序列化的處理
 8 dict_xu = json.dumps(dict,ensure_ascii=False)    #添加ensure_ascii=False進行序列化
 9 print('序列化后的數據類型為:', type(dict_xu)) 10 print('序列化后的數據為:', dict_xu) 11 #對dict_xu進行反序列化處理
12 dict_fan = json.loads(dict_xu) 13 print('反序列化后的數據類型為:', type(dict_fan)) 14 print('反序列化后的數據為: ', dict_fan) 15 ----------------------------------------------------------------------
16 未序列化前的數據類型為: <class 'dict'>
17 為序列化前的數據: {'name': 'zhangsan', 'age': 33, 'address': '紅星路'} 18 序列化后的數據類型為: <class 'str'>
19 序列化后的數據為: {"name": "zhangsan", "age": 33, "address": "紅星路"} 20 反序列化后的數據類型為: <class 'dict'>
21 反序列化后的數據為:  {'name': 'zhangsan', 'age': 33, 'address': '紅星路'}

 

   在實際的工作中,序列化或者反序列化的可能是一個文件的形式,不可能像如上寫的那樣簡單的,下來就來實現這部分,把文件內容進行序列化和反序列化,先來看序列化的代碼,兩步操作:1、先序列化 列表對象 ;2、步把序列化成的字符串寫入文件:

 1 #coding: utf-8
 2 import json  3 
 4 list = ['Apple','Huawei','selenium','java','python']  5 #把list先序列化,寫入到一個文件中
 6 # 兩步操作 1步先序列化 列表對象 2步把序列化成的字符串寫入文件
 7 json.dump(list, open('e:/test.txt','w'))  8 r1=open('e:/test.txt','r')  9 print(r1.read()) 10 -------------------------------------------------------------------
11 ["Apple", "Huawei", "selenium", "java", "python"]

反序列化,兩步操作:1、先讀取文件的字符串對象;2、然后反序列化成列表對象:

 1 #coding: utf-8
 2 import json  3 
 4 list = ['Apple','Huawei','selenium','java','python']  5 #把list先序列化,寫入到一個文件中
 6 # 兩步操作 1步先序列化 列表對象 2步把序列化成的字符串寫入文件
 7 json.dump(list, open('e:/test.txt','w'))  8 r1=open('e:/test.txt','r')  9 print(r1.read()) 10 #------------------------------------------------------------
11 #兩步操作:1、先讀取文件的字符串對象;2、然后反序列化成列表對象
12 res=json.load(open('e:/test.txt','r')) 13 print (res) 14 print('數據類型:',type(res)) 15 -------------------------------------------------------------
16 ["Apple", "Huawei", "selenium", "java", "python"] 17 ['Apple', 'Huawei', 'selenium', 'java', 'python'] 18 數據類型: <class 'list'>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM