json模組不僅可以處理普通的python內建型別,也可以處理我們自定義的資料型別,而往往處理自定義的物件是很常用的。
首先,我們定義乙個類person。
class person(object):
def __init__(self,name,age):
self.name = name
self.age = age
def __repr__(self):
return 'person object name : %s , age : %d' % (self.name,self.age)
if __name__ == '__main__':
p = person('peter',22)
print p
如果直接通過json.dumps方法對person的例項進行處理的話,會報錯,因為json無法支援這樣的自動轉化。通過上面多提到的json和python的型別轉化對照表,可以發現,object型別是和dict相關聯的,所以我們需要把我們自定義的型別轉化為dict,然後再進行處理。這裡有兩種方法可以使用。
'''
created on 2011-12-14
@author: peter
'''import person
import json
p = person.person('peter',22)
def object2dict(obj):
#convert object to a dict
d = {}
d['__class__'] = obj.__class__.__name__
d['__module__'] = obj.__module__
d.update(obj.__dict__)
return d
def dict2object(d):
#convert dict to object
if'__class__' in d:
class_name = d.pop('__class__')
module_name = d.pop('__module__')
module = __import__(module_name)
class_ = getattr(module,class_name)
args = dict((key.encode('ascii'), value) for key, value in d.items()) #get args
inst = class_(**args) #create new instance
else:
inst = d
return inst
d = object2dict(p)
print d#
o = dict2object(d)
print type(o),o
#person object name : peter , age : 22
dump = json.dumps(p,default=object2dict)
print dump#
load = json.loads(dump,object_hook = dict2object)
print load
#person object name : peter , age : 22
上面**已經寫的很清楚了,實質就是自定義object型別和dict型別進行轉化。object2dict函式將物件模組名、類名以及__dict__儲存在dict物件裡,並返回。dict2object函式則是反解出模組名、類名、引數,建立新的物件並返回。在json.dumps 方法中增加default引數,該引數表示在轉化過程中呼叫指定的函式,同樣在decode過程中json.loads方法增加object_hook,指定轉化函式。
jsonencoder類負責編碼,主要是通過其default函式進行轉化,我們可以override該方法。同理對於jsondecoder。
'''
created on 2011-12-14
@author: peter
'''import person
import json
p = person.person('peter',22)
class myencoder(json.jsonencoder):
def default(self,obj):
#convert object to a dict
d = {}
d['__class__'] = obj.__class__.__name__
d['__module__'] = obj.__module__
d.update(obj.__dict__)
return d
class mydecoder(json.jsondecoder):
def __init__(self):
json.jsondecoder.__init__(self,object_hook=self.dict2object)
def dict2object(self,d):
#convert dict to object
if'__class__' in d:
class_name = d.pop('__class__')
module_name = d.pop('__module__')
module = __import__(module_name)
class_ = getattr(module,class_name)
args = dict((key.encode('ascii'), value) for key, value in d.items()) #get args
inst = class_(**args) #create new instance
else:
inst = d
return inst
d = myencoder().encode(p)
o = mydecoder().decode(d)
print d
print type(o), o
對於jsondecoder類方法,稍微有點不同,但是改寫起來也不是很麻煩。看**應該就比較清楚了。
自定義型別
typedef型別 typedef 已有型別 新建型別 示例 typedef double area,volume typedef int number number i1 area a enum enum 列舉型別名 enum week 預設sun 0,可以比較 如果修改必須形如enum week...
自定義型別
下面列舉幾種c語言中常用的自定義資料型別 1.結構體型別 當描述乙個整型變數時,可以用int,描述字元型變數時,可以用char,但要描述乙個學生時,因為這個學生包含的資訊很多,比如姓名,性別,年齡等,不能通過單一的型別來描述,所以,這裡引入結構體型別,將某個事物的共有屬性集合在一起,宣告乙個結構體型...
自定義型別
列舉從字面意思理解就是將可能取的值一一枚舉出來,列舉型別沒有成員 可言,裡邊存放的是可能取值。列舉型別的定義 enum day enum color printf d n red printf d n green printf d n blue 執行結果 day和color都是定義的列舉型別,中的內...