сериализация результата запроса с 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, вам нужно привести это возвращаемое значение в список.