如何找出对象无法进行JSON序列化的原因?

时间:2014-10-03 18:34:57

标签: python json django django-rest-framework

我有一个非常简单的数据用例,我希望将其序列化为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")

我如何找出原因?

3 个答案:

答案 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)