Python Json序列化與反序列化的示例
不同的編程語(yǔ)言有不同的數(shù)據(jù)類(lèi)型; 比如說(shuō):
Python的數(shù)據(jù)類(lèi)型有(dict、list、string、int、float、long、bool、None)
Java的數(shù)據(jù)類(lèi)型有(bool、char、byte、short、int、long、float、double)
C的數(shù)據(jù)類(lèi)型有(bit、bool、char、int、short、long、unsigned、double、float)
Tcl的數(shù)據(jù)類(lèi)型(int、bool、float、string)
Ruby的數(shù)據(jù)類(lèi)型(Number、String、Ranges、Symbols、true、false、Array、Hash)
...
他們的共同特點(diǎn)是,都有字符串類(lèi)型!
所以要實(shí)現(xiàn)不同的編程語(yǔ)言之間對(duì)象的傳遞,就必須把對(duì)象序列化為標(biāo)準(zhǔn)格式,比如XML,但更好的方法是序列化為JSON,因?yàn)镴SON表示出來(lái)就是一個(gè)字符串,可以被所有語(yǔ)言讀取,也可以方便地存儲(chǔ)到磁盤(pán)或者通過(guò)網(wǎng)絡(luò)傳輸。
JSON不僅是標(biāo)準(zhǔn)格式,并且比XML更快,而且可以直接在Web頁(yè)面中讀取,非常方便.
JSON類(lèi)型 Python類(lèi)型
{} dict
[] list
"string" str
1234.56 int或float
true True
false False
null None
在python中,序列化可以理解為:把python的對(duì)象編碼轉(zhuǎn)換為json格式的字符串,反序列化可以理解為:把json格式字符串解碼為python數(shù)據(jù)對(duì)象。在python的標(biāo)準(zhǔn)庫(kù)中,專(zhuān)門(mén)提供了json庫(kù)與pickle庫(kù)來(lái)處理這部分。
json的dumps方法和loads方法,可實(shí)現(xiàn)數(shù)據(jù)的序列化和反序列化。具體來(lái)說(shuō),dumps方法,可將json格式數(shù)據(jù)序列為Python的相關(guān)的數(shù)據(jù)類(lèi)型;loads方法則是相反,把python數(shù)據(jù)類(lèi)型轉(zhuǎn)換為json相應(yīng)的數(shù)據(jù)類(lèi)型格式要求。在序列化時(shí),中文漢字總是被轉(zhuǎn)換為unicode碼,在dumps函數(shù)中添加參數(shù)ensure_ascii=False即可解決。
下面是json的序列化與反序列化:
1、Json序列化如下:
import json print (json.__all__) #查看json庫(kù)的所有方法 ['dump', 'dumps', 'load', 'loads', 'JSONDecoder', 'JSONEncoder']
未在dumps函數(shù)中添加參數(shù)ensure_ascii=False,結(jié)果如下:
#coding: utf-8 import json dict = {'name':'zhangsan', 'age':33, 'address':'紅星路'} print('未序列化前的數(shù)據(jù)類(lèi)型為:', type(dict)) print('為序列化前的數(shù)據(jù):', dict) #對(duì)dict進(jìn)行序列化的處理 dict_xu = json.dumps(dict) #直接進(jìn)行序列化 print('序列化后的數(shù)據(jù)類(lèi)型為:', type(dict_xu)) print('序列化后的數(shù)據(jù)為:', dict_xu)
未序列化前的數(shù)據(jù)類(lèi)型為: <class 'dict'>
為序列化前的數(shù)據(jù): {'name': 'zhangsan', 'address': '紅星路', 'age': 33}
序列化后的數(shù)據(jù)類(lèi)型為: <class 'str'>
序列化后的數(shù)據(jù)為: {"name": "zhangsan", "address": "\u7ea2\u661f\u8def", "age": 33}
在dumps函數(shù)中添加參數(shù)ensure_ascii=False,結(jié)果如下:
#coding: utf-8 import json dict = {'name':'zhangsan', 'age':33, 'address':'紅星路'} print('未序列化前的數(shù)據(jù)類(lèi)型為:', type(dict)) print('為序列化前的數(shù)據(jù):', dict) #對(duì)dict進(jìn)行序列化的處理 dict_xu = json.dumps(dict,ensure_ascii=False) #添加ensure_ascii=False進(jìn)行序列化 print('序列化后的數(shù)據(jù)類(lèi)型為:', type(dict_xu)) print('序列化后的數(shù)據(jù)為:', dict_xu)
未序列化前的數(shù)據(jù)類(lèi)型為: <class 'dict'>
為序列化前的數(shù)據(jù): {'address': '紅星路', 'age': 33, 'name': 'zhangsan'}
序列化后的數(shù)據(jù)類(lèi)型為: <class 'str'>
序列化后的數(shù)據(jù)為: {"address": "紅星路", "age": 33, "name": "zhangsan"}
2、Json反序列化如下:
#coding: utf-8 import json dict = {'name':'zhangsan', 'age':33, 'address':'紅星路'} print('未序列化前的數(shù)據(jù)類(lèi)型為:', type(dict)) print('為序列化前的數(shù)據(jù):', dict) #對(duì)dict進(jìn)行序列化的處理 dict_xu = json.dumps(dict,ensure_ascii=False) #添加ensure_ascii=False進(jìn)行序列化 print('序列化后的數(shù)據(jù)類(lèi)型為:', type(dict_xu)) print('序列化后的數(shù)據(jù)為:', dict_xu) #對(duì)dict_xu進(jìn)行反序列化處理 dict_fan = json.loads(dict_xu) print('反序列化后的數(shù)據(jù)類(lèi)型為:', type(dict_fan)) print('反序列化后的數(shù)據(jù)為: ', dict_fan)
未序列化前的數(shù)據(jù)類(lèi)型為: <class 'dict'>
為序列化前的數(shù)據(jù): {'name': 'zhangsan', 'age': 33, 'address': '紅星路'}
序列化后的數(shù)據(jù)類(lèi)型為: <class 'str'>
序列化后的數(shù)據(jù)為: {"name": "zhangsan", "age": 33, "address": "紅星路"}
反序列化后的數(shù)據(jù)類(lèi)型為: <class 'dict'>
反序列化后的數(shù)據(jù)為: {'name': 'zhangsan', 'age': 33, 'address': '紅星路'}
在實(shí)際的工作中,序列化或者反序列化的可能是一個(gè)文件的形式,不可能像如上寫(xiě)的那樣簡(jiǎn)單的,下來(lái)就來(lái)實(shí)現(xiàn)這部分,把文件內(nèi)容進(jìn)行序列化和反序列化,先來(lái)看序列化的代碼,兩步操作:1、先序列化 列表對(duì)象 ;2、步把序列化成的字符串寫(xiě)入文件:
#coding: utf-8 import json list = ['Apple','Huawei','selenium','java','python'] #把list先序列化,寫(xiě)入到一個(gè)文件中 # 兩步操作 1步先序列化 列表對(duì)象 2步把序列化成的字符串寫(xiě)入文件 json.dump(list, open('e:/test.txt','w')) r1=open('e:/test.txt','r') print(r1.read())
["Apple", "Huawei", "selenium", "java", "python"]
反序列化,兩步操作:1、先讀取文件的字符串對(duì)象;2、然后反序列化成列表對(duì)象:
#coding: utf-8 import json list = ['Apple','Huawei','selenium','java','python'] #把list先序列化,寫(xiě)入到一個(gè)文件中 # 兩步操作 1步先序列化 列表對(duì)象 2步把序列化成的字符串寫(xiě)入文件 json.dump(list, open('e:/test.txt','w')) r1=open('e:/test.txt','r') print(r1.read()) #------------------------------------------------------------ #兩步操作:1、先讀取文件的字符串對(duì)象;2、然后反序列化成列表對(duì)象 res=json.load(open('e:/test.txt','r')) print (res) print('數(shù)據(jù)類(lèi)型:',type(res))
["Apple", "Huawei", "selenium", "java", "python"]
['Apple', 'Huawei', 'selenium', 'java', 'python']
數(shù)據(jù)類(lèi)型: <class 'list'>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Python使用protobuf序列化和反序列化的實(shí)現(xiàn)
- Python使用pickle進(jìn)行序列化和反序列化的示例代碼
- Python 序列化和反序列化庫(kù) MarshMallow 的用法實(shí)例代碼
- Python3.5 Json與pickle實(shí)現(xiàn)數(shù)據(jù)序列化與反序列化操作示例
- Python實(shí)現(xiàn)JSON反序列化類(lèi)對(duì)象的示例
- 老生常談Python序列化和反序列化
- 詳解Python中的序列化與反序列化的使用
- python3序列化與反序列化用法實(shí)例
- Python序列化與反序列化相關(guān)知識(shí)總結(jié)
相關(guān)文章
解決yum對(duì)python依賴(lài)版本問(wèn)題
這篇文章主要介紹了解決yum對(duì)python依賴(lài)版本問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07Python基于gevent實(shí)現(xiàn)高并發(fā)代碼實(shí)例
這篇文章主要介紹了Python基于gevent實(shí)現(xiàn)高并發(fā)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05Python裝飾器入門(mén)學(xué)習(xí)教程(九步學(xué)習(xí))
裝飾器(decorator)是一種高級(jí)Python語(yǔ)法。裝飾器可以對(duì)一個(gè)函數(shù)、方法或者類(lèi)進(jìn)行加工。本文給大家介紹Python裝飾器入門(mén)學(xué)習(xí)教程(九步學(xué)習(xí)),對(duì)python裝飾器相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2016-01-01Django rest framework分頁(yè)接口實(shí)現(xiàn)原理解析
這篇文章主要介紹了Django rest framework分頁(yè)接口實(shí)現(xiàn)原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08Python超簡(jiǎn)單容易上手的畫(huà)圖工具庫(kù)推薦
今天小編給大家分享一款很棒的python畫(huà)圖工具庫(kù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-05-05Python基于百度AI實(shí)現(xiàn)抓取表情包
本文先抓取網(wǎng)絡(luò)上的表情圖像,然后利用百度 AI 識(shí)別表情包上的說(shuō)明文字,并利用表情文字重命名文件,感興趣的小伙伴們可以參考一下2021-06-06