版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、概念序列化(Serialization):將對象的狀態(tài)信息轉(zhuǎn)換為可以存儲或可以通過網(wǎng)絡(luò)傳輸?shù)倪^程,傳輸?shù)母袷娇梢允荍SON、XML等。反序列化就是從存儲區(qū)域JSON,XML)讀取反序列化對象的狀態(tài),重新創(chuàng)建該對象。JSON(JavaScriptObjectNotation):一種輕量級數(shù)據(jù)交換格式,相對于XML而言更簡單,也易于閱讀和編寫,機(jī)器也方便解析和生成,Json是JavaScript中的一個(gè)子集。Python2.6開始加入了JSON模塊,無需另外下載,Python的Json模塊序列化與反序列化的過程分別是encoding和decodingencoding:把一個(gè)Python對象編碼轉(zhuǎn)換
2、成Json字符串decoding:把Json格式字符串解碼轉(zhuǎn)換成Python對象對于簡單數(shù)據(jù)類型(string、unicode、int、float、list、tuple、diet),可以直接處理。json.dumps方法對簡單數(shù)據(jù)類型encoding:importjsondata='a':"A",'b':(2,4),'c':3.0#list對象print"DATA:",repr(data)data_string=json.dumps(data)print"JSON:",data_stri
3、ng輸出:DATA:'a':'A','c':3.0,'b':(2,4)#python的dict類型的數(shù)據(jù)是沒有順序存儲的JSON:"a":"A","c":3.0,"b":2,4JSON的輸出結(jié)果與DATA很相似,除了一些微妙的變化,python的元組類型變成了Json的數(shù)組,Python到Json的編碼轉(zhuǎn)換規(guī)則是:json.loads方法處理單數(shù)據(jù)類型的decoding(解碼)轉(zhuǎn)換PythondietJSONobjectlist,tuplearrays
4、tr?unicodestringintlongfloatnumberTrueirueFalsefalseNonenullimportjsondata='a':"A",'b':(2,4),'c':3.0#list對象data_string=json.dumps(data)print"ENCODED:",data_stringdecoded=json.loads(data_string)print"DECODED:",decodedprint"ORIGINAL:",typ
5、e(data0'b')print"DECODED:",type(decoded0'b')輸出:ENCODED:"a":"A","c":3.0,"b":2,4DECODED:u'a':u'A',u'c':3.0,u'b':2,4ORIGINAL:<type'tuple'>DECODED:<type'list'>解碼過程中,json的數(shù)組最終轉(zhuǎn)換成了
6、python的list,而不是最初的tuple類型,Json到Python的解碼規(guī)則是:JSONPythonobjectdietarrayliststringunicedentimbsrCint)intjlongnumberCrealifloattrueTruefalseFalsenullNonejson的人文關(guān)懷編碼后的jSOn格式字符串緊湊的輸出,而且也沒有順序,因此dumps方法提供了一些可選的參數(shù),讓輸出的格式提高可讀性,如sort_keys是告訴編碼器按照字典排序(a到z)輸出。importjsondata='a':'A','b':(2
7、,4),'c':3.0print'DATA:',repr(data)unsorted=json.dumps(data)print'JSON:',json.dumps(data)print'SORT:',json.dumps(data,sort_keys=True)輸出:DATA:'a':'A','c':3.0,'b':(2,4)JSON:"a":"A","c":3.0,"b":2,4SOR
8、T:"a":"A","b":2,4,"c":3.0indent參數(shù)根據(jù)數(shù)據(jù)格式縮進(jìn)顯示,讀起來更加清晰:importjsondata='a':'A','b':(2,4),'c':3.0print'DATA:',repr(data)print'NORMAL:',json.dumps(data,sort_keys=True)print'INDENT:',json.dumps(data,sort_keys=Tr
9、ue,indent=2)輸出:DATA:'a':'A','c':3.0,'b':(2,4)NORMAL:"a":"A","b":2,4,"c":3.0INDENT:"a":"A","b":2,4,"c":3.0separators參數(shù)的作用是去掉后面的空格,從上面的輸出結(jié)果都能看到",:"后面都有個(gè)空格,這都是為了美化輸出結(jié)果的作用,但是在我們傳輸數(shù)據(jù)的
10、過程中,越精簡越好,冗余的東西全部去掉,因此就可以加上separators參數(shù):importjsondata='a':'A','b':(2,4),'c':3.0print'DATA:',repr(data)print'repr(data):',len(repr(data)print'dumps(data):',len(json.dumps(data)print'dumps(data,indent=2):',len(json.dumps(data,indent=2)pr
11、int'dumps(data,separators):',len(json.dumps(data,separators=(',',':')輸出:DATA:'a':'A','c':3.0,'b':(2,4)repr(data):35dumps(data):35dumps(data,indent=2):76dumps(data,separators):29skipkeys參數(shù),在encoding過程中,diet對象的key只可以是string對象,如果是其他類型,那么在編碼過程中就會拋出
12、ValueError的異常。skipkeys可以跳過那些非String對象當(dāng)作key的處理.importjsondata='a':'A','b':(2,4),'c':3.0,('d',):'Dtuple'try:printjson.dumps(data)except(TypeError,ValueError)aserr:print'ERROR:',errprintprintjson.dumps(data,skipkeys=True)輸出:ERROR:keysmustbeastring
13、"a":"A","c":3.0,"b":2,4讓json支持自定義數(shù)據(jù)類型以上例子都是基于python的built-in類型的,對于自定義類型的數(shù)據(jù)結(jié)構(gòu)json模塊默認(rèn)是沒法處理的,會拋出異常:TypeErrorxxisnotJSONserializable'此時(shí)你需要自定乂一個(gè)轉(zhuǎn)換函數(shù):importjsonclassMyObj(object):def-init_(self,s):self.s=sdef_repr一(self):return'<MyObj(%s)>'%self.s
14、obj=.MyObj('helloworld')try:printjson.dumps(obj)exceptTypeError,err:print'ERROR:',err#轉(zhuǎn)換函數(shù)defconvert_to_builtin_type(obj):print'default(',repr(obj),')'#把MyObj對象轉(zhuǎn)換成dict類型的對象d='-class一':objclassname一,'一module_':obj._module一,d.update(obj.一dict_)returndpri
15、ntjson.dumps(obj,default=convert_to_builtin_type)輸出:ERROR:<MyObj(helloworld)>isnotJSONserializabledefault(<MyObj(helloworld)>)”s”:"hellworld","_module_":"MyObj",”_class_”:”_main”#注意:這里的class和module根據(jù)你代碼的所在文件位置不同而不同相反,如果要把jsondecode成python對象,同樣也需要自定轉(zhuǎn)換函數(shù),傳遞給jS
16、On.loads方法的object_hook參數(shù):#jsontest.pyimportjsonclassMyObj(object):def-init_(self,s):self.s=sdef_repr一(self):return"<MyObj(%s)>"%self.sdefdict_to_object(d):if'一class_'ind:class_name=d.pop('_class_')module_name=d.pop('_module_')module=_import一(module_name)print&
17、quot;MODULE:",moduleclass_=getattr(module,class_name)print"CLASS",class_args=dict(key.encode('ascii'),value)forkey,valueind.items()print'INSTANCEARGS:',argsinst=class_(*args)else:inst=dreturninstencoded_object='"s":"helloworld","_module_&qu
18、ot;:"jsontest_class一":"MyObj"'myobj_instance=json.loads(encoded_object,object_hook=dict_to_object)printmyobj_instance輸出:MODULE:<module'jsontest'from'E:Usersliuzhijunworkspacepythonjsontest.py'>CLASS<class'jsontest.MyObj'>INSTANCEARGS:'s
19、':u'helloworld'<MyObj(helloworld)>MODULE:<module'jsontest'from'E:Usersliuzhijunworkspacepythonjsontest.py'>CLASS<class'jsontest.MyObj'>INSTANCEARGS:'s':u'helloworld'<MyObj(helloworld)>使用Encoder與Decoder類實(shí)現(xiàn)json編碼的轉(zhuǎn)換JSONEncOder
20、有一個(gè)迭代接口iterencode(data),返回一系列編碼的數(shù)據(jù),他的好處是可以方便的把逐個(gè)數(shù)據(jù)寫到文件或網(wǎng)絡(luò)流中,而不需要一次性就把數(shù)據(jù)讀入內(nèi)存importjsonencoder=json.JSONEncoder()data='a':'A','b':(2,4),'c':3.0forpartinencoder.iterencode(data):print'PART:',part輸出:PART:PART:PART:"a"PART:PART:"A"PART:,PART:&qu
21、ot;c"PART:PART:3.0PART:,PART:"b"PART:PART:2PART:,4PART:PART:PART:encode方法等價(jià)于.join(encoder.iterencode()而且預(yù)先會做些錯(cuò)誤檢查(比如非字符串作為diet的key),對于自定義的對象,我們只需從些JSONEncoder的defauit()方法,其實(shí)現(xiàn)方式與上面提及的函數(shù)convet_to_builtin_type()是類似的。importjsonimportjson_myobjclassMyObj(object):def_init_(self,s):self.s=sd
22、ef_repr一(self):return"<MyObj(%s)>"%self.sclassMyEncoder(json.JSONEncoder):defdefault(self,obj):print'default(',repr(obj),')'#Convertobjectstoadictionaryoftheirrepresentationd='一class_':obj._classname一,'一module_':obj._module一,d.update(obj.一dict一)returnd
23、obj=json_myobj.MyObj('helloworld')printobjprintMyEncoder().encode(obj)輸出:<MyObj(internaldata)>default(<MyObj(internaldata)>)"s":"helloworld","-module-":"Myobj","-class_":"MyObj"從json對Python對象的轉(zhuǎn)換:classMyDecoder(json.JSOND
24、ecoder):def_init一(self):json.JSONDecoder._init_(self,object_hook=self.dict_to_object)defdict_to_object(self,d):if'_class_'ind:class_name=d.pop('_class_')module_name=d.pop('一module)module=_import_(module_name)print'MODULE:',moduleclass_=getattr(module,class_name)print'
25、CLASS:',class_args=dict(key.encode('ascii'),value)forkey,valueind.items()print'INSTANCEARGS:',argsinst=class_(*args)else:inst=dreturninstencoded_object='"s":"helloworld","_module_":"jsontest","_class_":"MyObj"'myobj_instance=MyDecoder().decode(encoded_object)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024綠化工程承包合同范文
- 2024版防火卷簾門質(zhì)保期內(nèi)維修服務(wù)合同
- 2024酒店經(jīng)營權(quán)質(zhì)押貸款合同
- 2024年虛擬現(xiàn)實(shí)游戲開發(fā)與授權(quán)協(xié)議
- 2024生產(chǎn)車間設(shè)備銷售及安裝與環(huán)保服務(wù)合同3篇
- 2024物流設(shè)計(jì)、項(xiàng)目規(guī)劃合同
- 2024旋挖樁基礎(chǔ)施工質(zhì)量安全監(jiān)理合同范本3篇
- 2024版水電工程勞務(wù)合同
- 2024藝術(shù)品買賣合同中的真?zhèn)舞b別和交易方式
- 2024環(huán)保技術(shù)研發(fā)合同
- 法人代持免責(zé)任協(xié)議書(2篇)
- 閘站監(jiān)理實(shí)施細(xì)則
- 2024-2025學(xué)年湖北省恩施土家族苗族自治州數(shù)學(xué)六上期末檢測試題含解析
- 2024年中國寵物殯葬服務(wù)行業(yè)市場規(guī)模及發(fā)展前景研究報(bào)告(智研咨詢)
- 礦用電纜市場發(fā)展預(yù)測和趨勢分析
- 失蹤老人歸家協(xié)議書模板
- 2024年初三數(shù)學(xué)競賽考試試題
- 單位委托員工辦理水表業(yè)務(wù)委托書
- 2024年江蘇省蘇州市中考英語真題
- 02S501-2 雙層井蓋圖集標(biāo)準(zhǔn)
- 醫(yī)藥制造企業(yè)資本結(jié)構(gòu)優(yōu)化研究以貴州百靈為例
評論
0/150
提交評論