我有一个非常简单的数据用例,我希望将其序列化为JSON,但我仍然因错误TypeError: <api.tests.MemberInfo object at 0x02B26210> is not JSON serializable
这是我要序列化的对象 -
class MemberInfo:
def __init__(self, member_code):
self.memberCode = member_code
在Python shell中 -
>>> mi = MemberInfo('123')
>>> json.JSONEncoder().default(mi)
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "c:\Python34\lib\json\encoder.py", line 173, in default
raise TypeError(repr(o) + " is not JSON serializable")
我如何找出原因?
答案 0 :(得分:1)
您可以在您的类中嵌入一个属性,以将数据作为JSON返回。
from json import dumps
class MemberInfo:
def __init__(self, member_code, member_name):
self.memberCode = member_code
self.memberName = member_name
@property
def json(self):
return dumps({'code': self.memberCode, 'name': self.memberName})
member = MemberInfo(1234, 'Johnny Cash')
member.json
'{"code": 1234, "name": "Johnny Cash"}'
答案 1 :(得分:1)
原因很简单,你没有告诉它如何。
JSON是一种相当严格的格式,几乎只能处理字符串,整数,列表和字符串。甚至不能直接序列化日期时间。因此,如果你想序列化一个Django模型,你需要根据json所理解的脚趾提供某种形式的表示。
答案 2 :(得分:1)
问题是json序列化程序不知道如何序列化类,这就是它停止工作的原因。
如果使用原始类型将类转换为包含所有属性及其值的字典,则可以将其序列化而不会出现任何问题。以下是其工作原理的示例:
import json
from decimal import Decimal
class MemberInfo:
def __init__(self, member_code):
self.memberCode = member_code
def to_dict(self):
return dict(memberCode=self.memberCode)
instance = MemberInfo('123123')
try:
# This will break since classes cannot be serialized
json.dumps(instance)
except TypeError as e:
print 'CLASS ERROR: %s' % e.message
# This will also break since it has a class Decimal
instance = dict(memberCode=Decimal(123123))
try:
# This will break since classes cannot be serialized
json.dumps(instance)
except TypeError as e:
print 'CLASS ERROR: %s' % e.message
# This will work since there aren't any classes and all keys are simple types
instance = MemberInfo('123123').to_dict()
print 'This will return a valid result'
print json.dumps(instance)