json.load()関数とjson.loads()関数の違いは何ですか


172

Pythonでは、どのような違いであるjson.load()とはjson.loads()

私は推測負荷()しながら、関数はファイルオブジェクト(私はコンテキストマネージャを使用することが必要)と一緒に使用しなければならない負荷()関数は、文字列としてファイルへのパスを取ります。それは少し混乱しています。

文字「s」は文字列json.loads()表しますか?

回答ありがとうございます!


1
json.loads(s, *)-デシリアライズsstrbytesまたはbytearrayJSON文書を含むインスタンス) - docs.python.org/3.6/library/json.html
deceze

回答:


160

はい、s文字列を表します。このjson.loads関数はファイルパスではなく、ファイルの内容を文字列として受け取ります。https://docs.python.org/2/library/json.htmlにあるドキュメントをご覧ください


5
リンクされた記事は間違ったpythonバージョンを指しています。質問のタグは2.7です。
RvdK 2016

@Sufiyan Ghoriからの回答は、この短い回答に加えて、適切な回答を示しています。
ウラッド

65

誰もが説明したものに簡単な例を追加するだけで、

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.stdinfileオブジェクトを返すので、そうすると、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()))代わりに使用します。


4
BEST(詳細)回答。(短い)受け入れられた回答に同調するために投票する必要があります。一緒に彼らは強いです:-)
Wlad

ちょうどFYI、Pythonの3.6.5とwith open()し、json.loads()例外を返します:TypeError: the JSON object must be str, bytes or bytearray, not 'TextIOWrapper'
Sergiy Kolodyazhnyy

30

ドキュメントは非常に明確です: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、ファイルのあるloadsAのstring


1
「オブジェクトのようなファイル」対「str / unicodeインスタンス」。不明な点がわかりません。
RvdK

7

迅速な回答(非常にシンプル化!)

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.dump/ dumpsjson.load/ loads bogotobogo.com/python/...
WLAD

1

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))を入力として取得し、辞書を返すことがわかります。


0

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')
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.