сериализация результата запроса с json вызывает ошибку:

Я пытался сериализовать список 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
>>>

Ответ 1

"Я пытаюсь сериализовать список 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',))

Ответ 2

EDIT после прочтения других ответов

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

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

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

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

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

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

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

HTH, по крайней мере, отслеживая проблему!

Ответ 3

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

ids = p.values_list('id',flat=True)
ids_list = list(ids)
import json
json.dumps(ids_list)

Ответ 4

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

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

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