2012-08-18 4 views
2

Во-первых, простой вопрос о сроках,
Кодирование (json.dumps) означает, преобразуя то JSon строку,
декодирования (json.loads) означает, что преобразование JSON строку типа JSON (?)питон JSON сериализации DateTime


у меня есть список объектов, которые я получил от

>>> album_image_list = AlbumImage.objects.all().values(*fields)[offset:count] 
>>> json.dumps(album_image_list[0], cls=DjangoJSONEncoder) 
'{"album": 4, "album__title": "g jfd", "created_at": "2012-08-18T02:23:49Z", "height": 1024.0, "width": 512.0, "url_image": "http://--:8000/media/101ac908-df50-42cc-af6f-b172c8829a31.jpg"}' 

, но когда я пытаюсь же на весь список (album_image_list), он терпит неудачу ...

>>> json.dumps(album_image_list, cls=DjangoJSONEncoder) 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/usr/lib/python2.6/json/__init__.py", line 237, in dumps 
    **kw).encode(obj) 
    File "/usr/lib/python2.6/json/encoder.py", line 367, in encode 
    chunks = list(self.iterencode(o)) 
    File "/usr/lib/python2.6/json/encoder.py", line 317, in _iterencode 
    for chunk in self._iterencode_default(o, markers): 
    File "/usr/lib/python2.6/json/encoder.py", line 323, in _iterencode_default 
    newobj = self.default(o) 
    File "/home/--/virtualenvs/aLittleArtist/lib/python2.6/site-packages/django/core/serializers/json.py", line 75, in default 
    return super(DjangoJSONEncoder, self).default(o) 
    File "/usr/lib/python2.6/json/encoder.py", line 344, in default 
    raise TypeError(repr(o) + " is not JSON serializable") 
TypeError: [{'album': 4L, 'album__title': u'g jfd', 'created_at': datetime.datetime(2012, 8, 18, 2, 23, 49, tzinfo=<UTC>), 'height': 1024.0, 'width': 512.0, 'url_image': u'http://--:8000/media/101ac908-df50-42cc-af6f-b172c8829a31.jpg'}, {'album': 4L, 'album__title': u'g jfd', 'created_at': datetime.datetime(2012, 8, 18, 1, 54, 51, tzinfo=<UTC>), 'height': 512.0, 'width': 512.0, 'url_image': u'http://--:8000/media/e85d1cf7-bfd8-4e77-b90f-d1ee01c67392.jpg'}] is not JSON serializable 
>>> 

Почему это удается на одном элементе и не удается выполнить его в списке?

ответ

2

.values() фактически не возвращает список. Он возвращает ValuesQuerySet, который не может быть сериализуемым модулем json. Попробуйте преобразовать album_image_list в список:

json.dumps(list(album_image_list), cls=DjangoJSONEncoder) 
+0

QuerySet имеет «ленивая загрузка» продолжается, хотя я не совсем понимаю, как это работает. «Lazy» означает, что он на самом деле загружает данные «полей» лениво ?. Я полагаю, что ValuesQuerySet уже выбрал «данные полей» и не имеет ничего общего с ленивой загрузкой? – eugene

+0

Я считаю, что 'ValuesQuerySet' также ленив. Он не попадет в базу данных, пока вы на самом деле не перейдете через нее или не преобразуете ее в список. – dgel

3

Если вы хотите просто сбросить словарь в JSON, просто использовать json.dumps. Он может быть легко сериализовать объекты, передавая в пользовательском классе сериализации - есть один в комплекте с Django, который имеет дело с DateTimes уже:

from django.core.serializers.json import DjangoJSONEncoder 
json.dumps(mydictionary, cls=DjangoJSONEncoder) 
0
class DateTimeJSONEncoder(json.JSONEncoder): 
    def default(self, obj): 
     if isinstance(obj, datetime.datetime): 
      return obj.isoformat() 
     else: 
      return super(DateTimeJSONEncoder, self).default(obj) 

updated_at=DateTimeJSONEncoder().encode(p.updated_at) 

Это поможет вам сериализовать объект DATETIME

Смежные вопросы