результат сериализации набора запросов с json вызывает ошибку: - PullRequest
10 голосов
/ 17 июля 2011

Я пытался сериализовать список Python, но получил ошибки, которые не сериализуются.Есть ли ограничение на сериализацию списка длинных целых чисел?

>>> ids=p.values_list('id',flat=True)
>>> ids
[335L, 468L, 481L, 542L, 559L, 567L, 609L]
>>> import simplejson as json
>>> str=json.dumps(ids)

Traceback (most recent call last):
   File "<console>", line 1, in <module>
  File "C:\Program Files\Google\google_appengine\lib\simplejson\simplejson\__ini
t__.py", line 265, in dumps
    return _default_encoder.encode(obj)
  File "C:\Program Files\Google\google_appengine\lib\simplejson\simplejson\encod
er.py", line 216, in encode
    chunks = list(chunks)
  File "C:\Program Files\Google\google_appengine\lib\simplejson\simplejson\encod
er.py", line 495, in _iterencode
    o = _default(o)
  File "C:\Program Files\Google\google_appengine\lib\simplejson\simplejson\encod
er.py", line 190, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: [335L, 468L, 481L, 542L, 559L, 567L, 609L] is not JSON serializable
>>>

Ответы [ 4 ]

17 голосов
/ 17 июля 2011

«Я пытаюсь сериализовать список Python ...»
Это на самом деле не совсем полная история.
Вы пытаетесь сериализовать ValuesListQuerySet.

>>> type(ids)
<class 'django.db.models.query.ValuesListQuerySet'>

Вы можете либо
1. преобразовать в список Python, как указано в других замечательных ответах, или
2. сериализовать только идентификаторы.

Django имеет встроенный способ сериализации QuerySet.
Вам нужны только идентификаторы, поэтому вы можете использовать fields kwarg.

from django.core import serializers
data = serializers.serialize('json', YourEntity.objects.all(), fields=('id',))
4 голосов
/ 17 июля 2011

РЕДАКТИРОВАТЬ после прочтения других ответов

Исходный ответ, который я дал (здесь ниже, без ограничений), был верным при диагностике проблемы ( аргумент, передаваемый в функцию json, не является списком ).Я оставляю это, поскольку это объясняет процедуру отладки (возможно, некоторого использования для других подобных ситуаций), но новые ответы как @Jacinda, так и @Adam более "к месту".В частности, последний содержит инструкции о том, как использовать встроенную функциональность django для решения проблемы.

Оригинальный ответ

Не уверен на 100%, потому что я не могу воспроизвести проблему в моей системе,но, судя по всему, это проблема в типе / кодировании данных.

Я бы начал с повторного тестирования вашего кода, вручную назначив ids с:

ids = [335L, 468L, 481L, 542L, 559L, 567L, 609L]

(в моей системе ваш код работает в этом случае).Если это работает и для вас, то выясните, какой тип объекта ids при назначении через p.values_list('id',flat=True) [вы можете сделать это с помощью type(ids)].Возможно, ids - это объект, представление которого совпадает со списком, но это не список.

В этом случае вы можете попробовать приведение типов: ids = list(p.values_list('id',flat=True)) перед передачей его в jsonфункция, но нет гарантии, что она будет работать (это зависит от того, является ли возвращаемое значение p.values_list итеративным или нет.

HTH хотя бы для отслеживания проблемы!

3 голосов
/ 22 февраля 2013

Я столкнулся с той же ошибкой, и после большого замешательства, наконец, решение, которое работало для меня, заключается в следующем: один ответ на вопрос, заданный @afshin:

ids = p.values_list('id',flat=True)
ids_list = list(ids)
import json
json.dumps(ids_list)
2 голосов
/ 17 июля 2011

Проблема здесь в том, что values_list(), которая является функцией django (вы, вероятно, должны уточнить это в своем вопросе), не возвращает список.

>>> x = UserProfile.objects.values_list('employee_id', flat=True)
>>> type(x)
>>> <class 'django.db.models.query.ValuesListQuerySet'>

simplejson.dumps не знает, как сериализовать этот объект. Поэтому, как подсказал @mac, вам нужно типизировать это возвращаемое значение в список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...