Pythonでは、json.load()
とjson.loads()
の違いは何ですか?
私はload()関数はファイルオブジェクトと一緒に使わなければならないと思います(したがってコンテキストマネージャを使う必要があります)がloads()関数はファイルへのパスを文字列として取ります。少し混乱します。
json.loads()
の文字 " s "は string を表しますか?
ご回答ありがとうございます。
はい、s
は文字列を表します。 json.loads
関数はファイルパスを取りませんが、ファイルの内容を文字列として取ります。 https://docs.python.org/2/library/json.html ]でドキュメントを見てください。
ドキュメントは非常に明確です: https://docs.python.org/2/library/json.html
json.load(fp[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])
この変換テーブルを使用してfp(a .read() - JSONドキュメントを含むファイルのようなサポートオブジェクト)をPythonオブジェクトに逆シリアル化します。
json.loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])
この変換テーブルを使用してs(JSONドキュメントを含むstrまたはUnicodeのインスタンス)をPythonオブジェクトに逆シリアル化します。
したがって、load
はファイル用、loads
はstring
用です。
誰もが説明したことに簡単な例を追加するだけです。
json.load()
json.load
はファイル自体をデシリアライズすることができます、すなわちそれはfile
オブジェクトを受け取ります、
with open("json_data.json", "r") as content:
print(json.load(content))
出力します
{u'event': {u'id': u'5206c7e2-da67-42da-9341-6ea403c632c7', u'name': u'Sufiyan Ghori'}}
なぜならcontent
はfile
型、つまり<type 'file'>
型だからです。
代わりにjson.loads
を使うと
with open("json_data.json", "r") as content:
print(json.loads(content))
私はこのエラーが出ます:
TypeError:予想される文字列またはバッファ
json.loads()
json.loads()
は文字列を非選択化します。
content.read()
をjson.loads()
とともに使用すると、ファイルの内容が返されます。
with open("json_data.json", "r") as content:
print(json.loads(content.read()))
出力、
{u'event': {u'id': u'5206c7e2-da67-42da-9341-6ea403c632c7', u'name': u'Sufiyan Ghori'}}
これは、content.read()
の型が文字列、つまり<type 'str'>
であるためです。
json.load()
とcontent.read()
を一緒に使うとエラーになります、
with open("json_data.json", "r") as content:
print(json.load(content.read()))
与える、
AttributeError: 'str'オブジェクトには属性 'read'がありません
これで、json.load
がファイルをデシリアライズし、json.loads
が文字列をデシリアライズできるようになりました。
別の例、
sys.stdin
はfile
オブジェクトを返すので、print(json.load(sys.stdin))
を実行すれば、実際のjsonデータが得られます。
cat json_data.json | ./test.py
{u'event': {u'id': u'5206c7e2-da67-42da-9341-6ea403c632c7', u'name': u'Sufiyan Ghori'}}
json.loads()
を使いたいのであれば、代わりにprint(json.loads(sys.stdin.read()))
を使います。