web-dev-qa-db-fra.com

Python JSON n'a pas d'attribut 'dumps'

J'exécute Python 2.7 (x64 Linux) et j'essaie de convertir un dict en un objet JSON.

>>> import sys
>>> sys.version_info
sys.version_info(major=2, minor=7, micro=0, releaselevel='final', serial=0)

J'essaie d'utiliser simplejson (retombant sur json à partir de la bibliothèque standard) mais j'obtiens l'erreur suivante:

>>> try: import simplejson as json
... except ImportError: import json
...                  
>>> metadata = dict()
>>> metadata['foo'] = 'bar'
>>> print metadata
{'foo': 'bar'}
>>> json.dumps(metadata)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'dumps' 

Y a-t-il quelque chose d'évident qui me manque dans l'utilisation de json ou simplejson avec Python 2.7?

31
Alex Reynolds

Il s'est avéré que j'avais une ancienne bibliothèque json chargée à partir d'une ancienne installation Python:

>>> import json                                                                                                                                                                                                                                                                           
>>> print json.__file__                                                                                                                                                                                                                                                                   
/home/areynolds/opt/lib/python2.5/site-packages/json.pyc

La suppression de ces anciens éléments a résolu le problème. Merci!

19
Alex Reynolds

A eu des problèmes similaires, il a été causé par un autre module personnalisé. J'ai nommé un autre script json.py et il s'avère qu'il a essayé de charger le fichier json.py personnalisé en tant que module. La méthode des vidages n'y est évidemment pas disponible.

Renommer le script json.py en quelque chose d'autre (json2.py) a éliminé le problème.

64
Paulo SantAnna

Avez-vous un fichier nommé json ou simplejson dans votre chemin d'accès qui ne fait pas partie de ces deux bibliothèques? Si vous le faites, alors python chargera ce fichier au lieu de la vraie bibliothèque.

13
guidoism

Comment reproduire cette erreur python:

AttributeError: 'module' object has no attribute 'dumps'

Vous avez probablement créé un fichier appelé json.py accessible à partir de sys.path. Ou vous avez ajouté un répertoire à sys.path de votre python qui comprenait un fichier appelé json.py.

Option 1: Empoisonner le puits en important json, puis en important un autre module avec le même alias:

eric@dev /var/www/sandbox/eric $ python

>>> import json

>>> json.dumps([])
'[]'

>>> import sys as json

>>> json.dumps([])

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'dumps'

Option 2: Empoisonner le puits en créant un fichier appelé json.py dans le chemin python:

Créez un nouveau fichier json.py, enregistrez-le. Mettez ce code là-dedans:

def foo():
  print "bar"

Ouvrez le terminal python et importez json:

eric@dev /var/www/sandbox/eric/wsgi $ python
>>> import json

>>> type(json)
<type 'module'>

>>> json.dumps([])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'dumps'

>>> json.foo()
bar

Cela vous indique que votre méthode n'est pas là. Alors demandez python pour vous en dire plus sur la nature de ce module et vous trouverez des indices sur qui l'a empoisonné.

>>> print json
<module 'json' from 'json.py'>
>>> dir(json)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'foo']
>>> type(json)
<type 'module'>
6
Eric Leschinski

Vous pouvez avoir un autre script dans votre Python appelé "json", que vous importez par accident. Vous pouvez résoudre ce problème en renommant celui sous votre contrôle ou en utilisant

from __future__ import absolute_import
4
Chris Lamb

Je crée un fichier nommé json.py. Lorsque je lance ceci, j'ai eu l'erreur, alors je le renomme et ça me dit.

1
zhao

Même moi, je faisais face à une erreur similaire lors de l'exécution de json.dump (). Dans mon cas, j'obtenais une chaîne d'erreur:

AttributeError: l'objet 'file' n'a pas d'attribut 'dump'

Comment je l'ai corrigé -

J'utilisais le nom de variable comme "json" pour le descripteur de fichier dans le même script, c'est pourquoi j'obtenais cette erreur. J'ai donc simplement renommé ce nom de variable et le problème résolu.

1
Pravin Junnarkar

J'ai discuté des problème et solution ci-dessous

Problème: lorsque vous appelez la fonction d'importation sur python, python essayez de trouver le module dans votre répertoire de travail, s'il ne le trouve pas dans votre répertoire local, c'est quand il cherchera des bibliothèques standard et d'autres dépôts globaux. Par conséquent, si vous essayez d'importer le module json, il essaiera de le trouver dans votre répertoire et si vous avez un fichier nommé 'json.py', python chargera ce module et essaiera de trouver la fonction 'dump' dans votre json.py. s'il ne trouve pas la fonction 'dump' dans votre fichier, il lancera une erreur 'module' objet n'a pas d'attribut 'dumps '.

Résolution: renommez votre fichier 'json.py' en un nom différent: comme json_file.py ou autre chose que 'json.py'.

0
Shishay Ghebrehiwet

Cette erreur vient de se produire pour moi dans un contexte différent, mais toujours l'une des deux choses nommées json. J'avais nommé une "vue" dans Django (une fonction Python qui prépare une réponse à une demande HTTP), dans ce cas une vue pour gérer la demande de données au format json.

Mais j'avais nommé la vue "json". Mauvais mouvement. J'ai été perplexe lorsque print dir (json) a renvoyé une réponse sans vidage dans ma vue "json" alors qu'il montrait "dumps" comme attribut dans une vue similaire qui fonctionnait.

Cette discussion a résolu le problème pour moi.

0
Mike O'Connor