python自定義型別轉json

2021-07-11 11:27:17 字數 3163 閱讀 7121

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都是定義的列舉型別,中的內...