回答:
誰もが説明したものに簡単な例を追加するだけで、
json.load()
json.load
ファイル自体を逆シリアル化できます。つまり、file
オブジェクトを受け入れます。たとえば、
# open a json file for reading and print content using json.load
with open("/xyz/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'}}
json.loads
代わりにファイルを開くために使用する場合、
# you cannot use json.loads on file object
with open("json_data.json", "r") as content:
print(json.loads(content))
私はこのエラーを受け取ります:
TypeError:期待される文字列またはバッファ
json.loads()
json.loads()
文字列をデシリアライズします。
したがって、使用するために、たとえば関数json.loads
を使用してファイルのコンテンツを渡す必要がありますread()
。
ファイルの戻りコンテンツで使用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()))
代わりに使用します。
with open()
し、json.loads()
例外を返します:TypeError: the JSON object must be str, bytes or bytearray, not 'TextIOWrapper'
ドキュメントは非常に明確です: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(JSONドキュメントを含む.read()をサポートするファイルのようなオブジェクト)を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
Aのstring
json.load()はFILEを取ります
json.load()はファイル(ファイルオブジェクト)を期待します-たとえば、のようなfilepathによって指定される前に開いたファイル
'files/example.json'
。
json.loads()はSTRINGを受け取ります
json.loads()は(有効な)JSON文字列を期待します-つまり
{"foo": "bar"}
次の内容のファイルexample.jsonがあると想定します:{"key_1":1、 "key_2": "foo"、 "Key_3":null}
>>> import json
>>> file = open("example.json")
>>> type(file)
<class '_io.TextIOWrapper'>
>>> file
<_io.TextIOWrapper name='example.json' mode='r' encoding='UTF-8'>
>>> json.load(file)
{'key_1': 1, 'key_2': 'foo', 'Key_3': None}
>>> json.loads(file)
Traceback (most recent call last):
File "/usr/local/python/Versions/3.7/lib/python3.7/json/__init__.py", line 341, in loads
TypeError: the JSON object must be str, bytes or bytearray, not TextIOWrapper
>>> string = '{"foo": "bar"}'
>>> type(string)
<class 'str'>
>>> string
'{"foo": "bar"}'
>>> json.loads(string)
{'foo': 'bar'}
>>> json.load(string)
Traceback (most recent call last):
File "/usr/local/python/Versions/3.7/lib/python3.7/json/__init__.py", line 293, in load
return loads(fp.read(),
AttributeError: 'str' object has no attribute 'read'
json.load()(「負荷」の「S」のない)メソッドは、ファイルを直接読み取ることができます。
import json
with open('strings.json') as f:
d = json.load(f)
print(d)
json.loads()メソッド。文字列引数にのみ使用されます。
import json
person = '{"name": "Bob", "languages": ["English", "Fench"]}'
print(type(person))
# Output : <type 'str'>
person_dict = json.loads(person)
print( person_dict)
# Output: {'name': 'Bob', 'languages': ['English', 'Fench']}
print(type(person_dict))
# Output : <type 'dict'>
ここでは、loads()を使用した後、文字列(type(str))を入力として取得し、辞書を返すことがわかります。
python3.7.7では、json.loadの定義はcpythonのソースコードによると以下のようになります:
def load(fp, *, cls=None, object_hook=None, parse_float=None,
parse_int=None, parse_constant=None, object_pairs_hook=None, **kw):
return loads(fp.read(),
cls=cls, object_hook=object_hook,
parse_float=parse_float, parse_int=parse_int,
parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
json.loadは実際にjson.loadsを呼び出しfp.read()
、最初の引数として使用します。
したがって、コードが次の場合:
with open (file) as fp:
s = fp.read()
json.loads(s)
これを行うのも同じです。
with open (file) as fp:
json.load(fp)
しかし、ファイルから読み取るバイトを同じように指定する必要がある場合、fp.read(10)
または逆シリアル化する文字列/バイトがファイルからではない場合は、json.loads()を使用する必要があります。
json.loads()に関しては、文字列だけでなくバイトもデシリアライズします。s
がバイトまたはバイト配列の場合、最初に文字列にデコードされます。また、ソースコードでそれを見つけることができます。
def loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None,
parse_int=None, parse_constant=None, object_pairs_hook=None, **kw):
"""Deserialize ``s`` (a ``str``, ``bytes`` or ``bytearray`` instance
containing a JSON document) to a Python object.
...
"""
if isinstance(s, str):
if s.startswith('\ufeff'):
raise JSONDecodeError("Unexpected UTF-8 BOM (decode using utf-8-sig)",
s, 0)
else:
if not isinstance(s, (bytes, bytearray)):
raise TypeError(f'the JSON object must be str, bytes or bytearray, '
f'not {s.__class__.__name__}')
s = s.decode(detect_encoding(s), 'surrogatepass')
json.loads(s, *)
-デシリアライズs
(str
、bytes
またはbytearray
JSON文書を含むインスタンス) - docs.python.org/3.6/library/json.html