le résultat de sérialisation d'un ensemble de requêtes avec json génère une erreur:
J'essayais de sérialiser une liste Python, mais a eu des erreurs qu'il n'est pas sérialisable. Est-il une limitation de la sérialisation d'une liste d'entiers Longs?
>>> 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
>>>
source d'informationauteur afshin
Vous devez vous connecter pour publier un commentaire.
"Je suis en train de sérialiser une liste Python..."
Ce n'est en fait pas toute l'histoire.
Vous essayez de sérialiser un
ValuesListQuerySet
.Vous pouvez soit
1. convertir une liste Python comme mentionné dans les autres réponses, ou
2. sérialiser juste l'Id.
Django a un moyen intégré pour sérialiser un
QuerySet
.Et vous voulez seulement l'Id de sorte que vous pouvez utiliser le
champs
kwarg.EDIT après avoir lu les autres réponses
L'original de la réponse que j'ai donné (ici ci-dessous intégrale) était correct pour diagnostiquer le problème (l'argument passé à la fonction json n'est pas une liste). Je suis le laisser comme il l'explique la procédure de débogage (peut-être d'une certaine utilité pour d'autres situations similaires), mais les nouvelles réponses de @Jacinda et @Adam sont plus "à la pointe". En particulier, ce dernier contient des instructions sur la façon d'utiliser un natif de django fonctionnalité pour surmonter le problème.
Réponse originale à cette question
Pas sûr à 100% parce que je ne peux pas reproduire le problème sur mon système, mais de le regarder, il me semble que c'est un problème dans le type et l'encodage des données.
Je voudrais commencer par tester à nouveau votre code en attribuer manuellement
ids
avec:(sur mon système de votre code fonctionne dans ce cas). Si cela fonctionne pour vous aussi, alors enquêter sur ce type d'objet est
ids
lorsqu'elle est affectée parp.values_list('id',flat=True)
[vous pouvez le faire avectype(ids)
]. Il se pourrait queids
est un objet dont la représentation est la même qu'une liste, mais que ce n'est pas une liste.Dans ce cas, vous pourriez essayer de typecasting:
ids = list(p.values_list('id',flat=True))
avant de les passer à la fonction json, mais il n'y a aucune garantie que cela fonctionnera (cela dépend si la valeur retournée dep.values_list
est itératif ou pas.HTH dans au moins assurer le suivi du problème!
J'ai rencontré la même erreur et après beaucoup de confusion, enfin la solution qui a fonctionné pour moi est comme suit dans une seule et unique réponse à la question posée par @afshin:
Le problème ici est que
values_list()
qui est un django fonction (ce qui est probablement devrait clarifier ce point dans votre question) ne renvoie pas une liste.simplejson.décharges ne sais pas comment sérialiser. Donc, comme @mac a suggéré, vous avez besoin de transtypage de cette valeur de retour d'une liste.