2014-10-03 28 views
1

我有數據非常簡單的例子,我想序列化到JSON,但我一直被錯誤TypeError: <api.tests.MemberInfo object at 0x02B26210> is not JSON serializable如何找出爲什麼一個對象不能被JSON序列化?

及彼跳閘的對象我想要序列 -

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

如何找出原因?

+2

Python標準庫和Django模型中的json模塊相處得不太好。我已經習慣於使用jsonpickle來代替:http://jsonpickle.github.io/ – Brandon 2014-10-03 18:56:13

+0

您可以添加您的模型字段嗎?這將有助於確定哪些不可序列化。 – Brandon 2014-10-03 19:45:45

回答

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) 
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"}' 
+0

我想這是一種方法,但它並沒有很好地回答這個問題。 – 2014-10-03 19:25:11

+0

我真的同意,但@ user3238014如何提出這個問題,它的解決方案是非常可行的 – 2014-10-03 19:28:43

+0

問題是「我怎樣才能找出原因?」 – 2014-10-03 19:32:56

0

原因很簡單,你沒有告訴它如何。

JSON是一種相當嚴格的格式,幾乎只能處理字符串,整數,列表和字符串。甚至不能將日期時間直接序列化。所以,如果你想序列化一個Django模型,你需要提供一些json明白的腳趾表示形式。

相關問題