web-dev-qa-db-ja.com

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と一緒に使用することについて私が見逃している明らかな何かがありますか?

31
Alex Reynolds

古いPythonインストール済み環境からロードされた古いjsonライブラリーがありました:

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

その古いものを削除すると、問題が修正されました。ありがとう!

19
Alex Reynolds

同様の問題があった場合、別のカスタムモジュールが原因でした。別のスクリプトにjson.pyそして、カスタムjson.pyファイルをモジュールとしてロードしようとしたことがわかりました。ダンプメソッドは明らかに利用できません。

Json.pyスクリプトの名前を別のもの(json2.py)に変更すると、この問題は解消されました。

64
Paulo SantAnna

これらの2つのライブラリのいずれでもないパスにjsonまたはsimplejsonという名前のファイルがありますか?その場合、pythonは実際のライブラリの代わりにそのファイルをロードします。

13
guidoism

これを再現する方法pythonエラー:

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

おそらく、Pythonのsys.pathから到達可能なjson.pyというファイルを作成したでしょう。または、json.pyというファイルを含むディレクトリをPythonのsys.pathに追加しました。

オプション1: 井戸を毒する jsonをインポートしてから、同じエイリアスを持つ別のモジュールをインポートする:

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'

オプション2: 井戸を毒する python path:

新しいファイルjson.pyを作成して保存します。そこにこのコードを入れてください:

def foo():
  print "bar"

pythonターミナルを開き、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

メソッドが存在しないことを示しています。だからpythonに尋ねて、このモジュールの性質についてもっと教えてください。だれがそれを毒殺したかの手がかりを見つけるでしょう。

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

Pythonパスに "json"と呼ばれる別のスクリプトがある場合がありますが、これは誤ってインポートしています。これは、管理下のスクリプトの名前を変更するか、

from __future__ import absolute_import
4
Chris Lamb

Json.pyという名前のファイルを作成します。これを実行すると、エラーが発生したので、名前を変更して、それを言葉にしました。

1
zhao

Json.dump()の実行中に私も同様のエラーに直面していました。私の場合、エラー文字列を取得していました:

AttributeError: 'file'オブジェクトには属性 'dump'がありません

修正方法-

同じスクリプトでファイル記述子の「json」として変数名を使用していたため、このエラーが発生していました。そのため、単に変数名を変更し、問題を解決しました。

1

問題およびについて以下で説明しました

問題: Pythonでインポート関数を呼び出すとき、python作業ディレクトリ内でモジュールを見つけようとします。ローカルディレクトリ内で見つからない場合は、そのときです。標準ライブラリおよびその他のグローバルリポジトリを検索します。したがって、jsonモジュールをインポートしようとすると、ディレクトリ内でそれを見つけようとし、「json.py」という名前のファイルがある場合、pythonはこのモジュールをロードし、json.py内で「dump」関数を見つけようとします。ファイル内で「dump」関数が見つからない場合は、「modules object has no attribute 'dumps」というエラーがスローされます'。

解像度:「json.py」ファイルの名前を別の名前に変更します:json_file.pyまたは「json.py」以外の名前。

0

このエラーは別のコンテキストで発生しましたが、それでもjsonという名前の2つのうちの1つです。 Django(a Python HTTPリクエストへの応答を準備する関数)、この場合はリクエストを処理するビューでJSON形式のデータ。

しかし、ビューに「json」という名前を付けました。悪い動き。 print dir(json)がビュー "json"でダンプなしの応答を返したのに、同様のビューでは属性として "dumps"が表示されたので、私は混乱しました。

この議論で問題は解決しました。

0
Mike O'Connor