2010-02-11 50 views
34

這怎麼可能導致這個錯誤?我進入這個:Django:「TypeError:[]不是JSON序列化」爲什麼?

def json(self): 
    return json.dumps(
     { 
      'items': self.items 
     } 
    ) 

,並得到了錯誤(因爲self.items是一個空的查詢集(Django的)

但隨後,

def json(self): 
    return json.dumps(
     { 
      'items': [] # Pass in empty list to prove that the error was idiotic. 
     } 
    ) 

工作的罰款(其中至少證明錯誤消息是毫無價值的)

這是因爲查詢集定義了repr()並返回'[]'作爲字符串時,它是空的或事端像那樣荒謬可笑?

+3

你爲什麼要定義一個與你正在使用的模塊同名的函數? – 2010-02-11 08:06:01

+0

@gnibbler這不是一個函數。這是一種方法,我將它用作@property(在我的例子中沒有包括這個)。 – orokusaki 2010-02-11 08:10:24

+3

我愛回頭看我是多麼的沾沾自喜,'......錯誤是愚蠢的。' – orokusaki 2013-11-15 15:44:32

回答

54

查詢集不是現成可串行化的。如果您嘗試使用list(self.items)而不是self.items,只要項目本身是JSON序列化的,就應該可以工作。

更新:即使它不爲空也會引發異常。我不認爲它會被認爲是Django的bug,儘管你可以嘗試;正如我已經說過的,最簡單的答案是使用list(qs)強制進行評估。

+1

+1。這是答案。您正在使用列表(queryset)強制立即對queryset進行評估。以列表形式的基礎數據是可序列化的;查詢集本身不是。 http://docs.djangoproject.com/en/dev/ref/models/querysets/#id1 – cethegeek 2010-02-11 14:34:39

+2

很好的答案。謝謝。順便說一句,這看起來像一個錯誤。我打算爲它開一張票。 Django的序列化器用於序列化Django查詢集。如果它在空的時候引發異常,那就是一個bug。 – orokusaki 2010-02-11 16:14:18

+1

@orokusaki,這對我來說不像一個bug。有時你想要物體。有時候你想要字符串。 Django讓你選擇。下面是一個更適合我的python替代方案,適用於所有Django字段:'[str(obj)for Model.objects.values()]中的obj [見下文](http://stackoverflow.com/a/14653384/ 623735) – hobs 2013-02-01 19:17:23

5

這是非常令人沮喪的。 Django的序列化對所有不是查詢集的東西抱怨,json.dumps抱怨Django的ORM支持中的對象。

>>> from cluster.models import Account 
>>> import json 
>>> json.dumps(Account.objects.all()[0]) 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 231, in dumps 
    return _default_encoder.encode(obj) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 201, in encode 
    chunks = self.iterencode(o, _one_shot=True) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 264, in iterencode 
    return _iterencode(o, 0) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 178, in default 
    raise TypeError(repr(o) + " is not JSON serializable") 
TypeError: <Account: 9de5-2653-000d-81a3 => [email protected]> is not JSON serializable 

對戰

>>> serializers.serialize("json", [clusters]) 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/serializers/__init__.py", line 91, in serialize 
    s.serialize(queryset, **options) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/serializers/base.py", line 41, in serialize 
    for field in obj._meta.local_fields: 
AttributeError: 'QuerySet' object has no attribute '_meta' 
4

由於維奈指出,即使在投射到一個列表,系列化往往仍然失敗。對於我來說,即使我要求ValuesQuerySet(類似於列表)的.values(),DateTimeField元素(datetime.datetime對象)上的序列化失敗。對我來說,解決方案是一個簡單的理解。

json.dumps([str(obj) for obj in Model.objects.values()]); 

在你的情況,這將是

return json.dumps({k: str(v) for k, v in self.__dict__.items()}) 

str神奇節省了一天。如果您需要序列化中的對象類型信息,則內置的repr也可能會有所幫助。

相關問題