【问题标题】:How can I find out why an object can't be JSON serialized? [duplicate]我怎样才能找出为什么一个对象不能被 JSON 序列化? [复制]
【发布时间】:2014-11-28 20:30:07
【问题描述】:

我有一个非常简单的数据用例,我希望将其序列化为 JSON,但我一直被错误 TypeError: <api.tests.MemberInfo object at 0x02B26210> is not JSON serializable

绊倒

这是我要序列化的对象-

class MemberInfo:
    def __init__(self, member_code):
        self.memberCode = member_code

在 Python 外壳中 -

>>> 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")

如何找出原因?

【问题讨论】:

  • Python 标准库中的 json 模块和 Django 模型相处得不是很好。我已经习惯使用 jsonpickle 代替:jsonpickle.github.io
  • 您能添加您的模型字段吗?这将有助于确定其中哪些是不可序列化的。

标签: python json django django-rest-framework


【解决方案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)

【讨论】:

    【解决方案2】:

    您可以在您的类中嵌入一个属性以将数据返回为 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"}'
    

    【讨论】:

    • 我想这是一种方法,但它不能很好地回答问题。
    • 我真的同意,但是@user3238014 是如何提出这个问题的,它的解决方案是非常可行的
    • 问题是“我怎样才能找出原因?”
    • 好的,抱歉。下次会多注意的!这么多愿意回答...
    【解决方案3】:

    原因很简单,就是你没有告诉它怎么做。

    JSON 是一种相当严格的格式,几乎只能处理字符串、整数、列表和字典。甚至日期时间也不能直接序列化。所以如果你想序列化一个 Django 模型,你需要根据 json 理解的 toes 提供某种形式的表示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-21
      • 1970-01-01
      相关资源
      最近更新 更多