[英]Python serialize objects list to JSON
我試圖將一個對象的__dict__
序列化為JSON,這是正常工作,直到我將對象追加到我的第一個對象的一個實例屬性:
from json import dumps
class A(object):
def __init__(self):
self.b_list = []
class B(object):
def __init__(self):
self.x = 'X'
self.y = 'Y'
def __repr__(self):
return dumps(self.__dict__)
a = A()
print dumps(a.__dict__) # works fine
a.b_list.append(B())
print dumps(a.__dict__)
當調用第二次dumps
,我得到以下TypeError
:
TypeError: {"y": "Y", "x": "X"} is not JSON serializable
我不明白為什么我一直得到這個錯誤,而我不明白為什么這不能序列化為JSON。
那是因為B
的實例不是一個簡單的類型。 因為你給了B
一個__repr__
方法,實例被印刷 ,因為它的JSON表示,但它本身不是一個支持JSON類型。
刪除__repr__
方法,並且回溯更容易混淆:
>>> class A(object):
... def __init__(self):
... self.b_list = []
...
>>> class B(object):
... def __init__(self):
... self.x = 'X'
... self.y = 'Y'
...
>>> a = A()
>>> a.b_list.append(B())
>>>
>>> print dumps(a.__dict__)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/json/__init__.py", line 243, in dumps
return _default_encoder.encode(obj)
File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/json/encoder.py", line 207, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/json/encoder.py", line 270, in iterencode
return _iterencode(o, 0)
File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/json/encoder.py", line 184, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <__main__.B object at 0x10a753e10> is not JSON serializable
使用default
關鍵字參數對自定義對象進行編碼:
def encode_b(obj):
if isinstance(obj, B):
return obj.__dict__
return obj
json.dumps(a, default=encode_b)
演示:
>>> def encode_b(obj):
... if isinstance(obj, B):
... return obj.__dict__
... return obj
...
>>> dumps(a.__dict__, default=encode_b)
'{"b_list": [{"y": "Y", "x": "X"}]}'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.