Подтвердить что ты не робот

У модуля Python JSON нет атрибутов 'dumps'

Я запускаю Python 2.7 (x64 Linux) и пытаюсь преобразовать объект dict в объект JSON.

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

Я пытаюсь использовать simplejson (возврат к json из стандартной библиотеки), но я получаю следующую ошибку:

>>> 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' 

Есть ли что-то очевидное, что я пропускаю при использовании json или simplejson с Python 2.7?

4b9b3361

Ответ 1

Оказалось, что у меня была старая библиотека json, загруженная из старой установки Python:

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

Удаление старого материала исправило проблему. Спасибо!

Ответ 2

Имели похожие проблемы, это было вызвано другим настраиваемым модулем. Я назвал еще один script json.py, и, оказывается, он попытался загрузить пользовательский файл json.py в качестве модуля. метод дампов, очевидно, там недоступен.

Переименование json.py script на что-то другое (json2.py) избавилось от проблемы.

Ответ 3

У вас есть файл с именем json или simplejson в вашем пути, который не является одной из этих двух библиотек? Если вы это сделаете, тогда python загрузит этот файл вместо реальной библиотеки.

Ответ 4

Как воспроизвести эту ошибку python:

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

Возможно, вы создали файл json.py, доступный из python sys.path. Или вы добавили каталог в свой sys.path python, который включал файл json.py.

Вариант 1: Отравить колодец путем импорта json, а затем импортировать другой модуль с тем же псевдонимом:

[email protected] /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'

Вариант 2: Отравить колодец, создав файл json.py в пути python:

Создайте новый файл json.py, сохраните его. Вставьте этот код там:

def foo():
  print "bar"

Откройте терминал python и импортируйте json:

[email protected] /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

Это говорит вам, что вашего метода нет. Поэтому попросите python рассказать вам больше о природе этого модуля, и вы найдете подсказки о том, кто его отравил.

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

Ответ 5

У вас может быть еще один script в вашем пути Python под названием "json", который вы импортируете случайно. Вы можете решить это, переименовав один из них под свой контроль или используя

from __future__ import absolute_import

Ответ 6

Эта ошибка произошла только для меня в другом контексте, но все же одна из двух вещей, названная json. Я назвал "представление" в Django (функция Python, которая готовит ответ на HTTP-запрос), в этом случае представление для обработки запроса данных в формате json.

Но я назвал представление "json". Плохой ход. Я был озадачен, когда print dir (json) вернул ответ "без отвала" на мой взгляд "json", тогда как он показал "дампы" как атрибут в схожем виде, которое сработало.

В этом обсуждении для меня была проблема.