Apa perbedaan antara fungsi json.load () dan json.loads ()

173

Dengan Python, apa perbedaan antara json.load()dan json.loads()?

Saya kira bahwa fungsi load () harus digunakan dengan objek file (jadi saya perlu menggunakan manajer konteks) sementara fungsi load () mengambil path ke file sebagai string. Agak membingungkan.

Apakah huruf " s " dalam json.loads()singkatan string ?

Terimakasih banyak untuk jawabanmu!

MMF
sumber
1
json.loads(s, *)- Deserialize s(a str, bytesatau bytearraycontoh yang berisi dokumen JSON) - docs.python.org/3.6/library/json.html
deceze

Jawaban:

160

Ya, ssingkatan dari string. The json.loadsfungsi tidak mengambil path file, tetapi isi file sebagai string. Lihatlah dokumentasi di https://docs.python.org/2/library/json.html !

Gijs
sumber
5
Artikel yang ditautkan menunjuk ke versi python yang salah. Pertanyaan ditandai sebagai 2.7.
RvdK
jawaban dari @Sufiyan Ghori memberikan contoh yang bagus selain jawaban singkat ini tapi to the point.
Wlad
65

Hanya akan menambahkan contoh sederhana untuk apa yang semua orang telah jelaskan,

json.load ()

json.loaddapat deserialize file itu sendiri yaitu menerima fileobjek, misalnya,

# 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))

akan menampilkan,

{u'event': {u'id': u'5206c7e2-da67-42da-9341-6ea403c632c7', u'name': u'Sufiyan Ghori'}}

Jika saya gunakan json.loadsuntuk membuka file,

# you cannot use json.loads on file object
with open("json_data.json", "r") as content:
  print(json.loads(content))

Saya akan mendapatkan kesalahan ini:

TypeError: string atau buffer yang diharapkan

json.loads ()

json.loads() deserialize string.

Jadi untuk menggunakan json.loadssaya harus melewati konten file menggunakan read()fungsi, misalnya,

gunakan content.read()dengan json.loads()mengembalikan konten file,

with open("json_data.json", "r") as content:
  print(json.loads(content.read()))

Keluaran,

{u'event': {u'id': u'5206c7e2-da67-42da-9341-6ea403c632c7', u'name': u'Sufiyan Ghori'}}

Itu karena jenis content.read()string, yaitu<type 'str'>

Jika saya gunakan json.load()dengan content.read(), saya akan mendapatkan kesalahan,

with open("json_data.json", "r") as content:
  print(json.load(content.read()))

Memberi,

AttributeError: objek 'str' tidak memiliki atribut 'baca'

Jadi, sekarang Anda tahu json.loadfile json.loadsdeserialze dan deserialize string.

Contoh lain,

sys.stdinmengembalikan fileobjek, jadi jika saya lakukan print(json.load(sys.stdin)), saya akan mendapatkan data json yang sebenarnya,

cat json_data.json | ./test.py

{u'event': {u'id': u'5206c7e2-da67-42da-9341-6ea403c632c7', u'name': u'Sufiyan Ghori'}}

Jika saya ingin menggunakan json.loads(), saya akan melakukannya print(json.loads(sys.stdin.read())).

Sufiyan Ghori
sumber
4
Jawaban TERBAIK (terperinci). Harus dipilih untuk menemani (pendek) jawaban yang diterima. Bersama-sama mereka kuat :-)
Wlad
Hanya FYI, dengan Python 3.6.5 with open()dan json.loads()mengembalikan pengecualian:TypeError: the JSON object must be str, bytes or bytearray, not 'TextIOWrapper'
Sergiy Kolodyazhnyy
30

Dokumentasi cukup jelas: 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]]]]]]]])

Deserialize fp (a .read () - mendukung file-like object yang berisi dokumen JSON) ke objek Python menggunakan tabel konversi ini.

json.loads(s[, encoding[, cls[, object_hook[, parse_float[, parse_int[, parse_constant[, object_pairs_hook[, **kw]]]]]]]])

Deserialize s (contoh str atau unicode yang berisi dokumen JSON) ke objek Python menggunakan tabel konversi ini.

Begitu loadjuga untuk file, loadsuntukstring

Rvdk
sumber
1
"File like object" vs "contoh str / unicode". Saya tidak mengerti apa yang tidak jelas?
Rvdk
7

JAWABAN CEPAT (sangat disederhanakan!)

json.load () membutuhkan FILE

json.load () mengharapkan file (objek file) - misalnya file yang Anda buka sebelum diberikan oleh filepath seperti 'files/example.json'.


json.loads () membutuhkan STRING

json.loads () mengharapkan string JSON (valid) - yaitu {"foo": "bar"}


CONTOH

Dengan asumsi Anda memiliki file example.json dengan konten ini: {"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'
Wlad
sumber
Tutorial tentang json.dump/ dumps& json.load/ loads bogotobogo.com/python/…
Wlad
1

Metode json.load () (tanpa "s" dalam "load") dapat membaca file secara langsung:

import json
with open('strings.json') as f:
    d = json.load(f)
    print(d)

Metode json.loads () , yang digunakan hanya untuk argumen string .

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

Di sini, kita dapat melihat setelah menggunakan load () mengambil string (tipe (str)) sebagai input dan kamus kembali .

Aditya patil
sumber
0

Dalam python3.7.7, definisi json.load adalah seperti di bawah ini sesuai dengan kode sumber 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 sebenarnya memanggil json.loads dan gunakan fp.read()sebagai argumen pertama.

Jadi, jika kode Anda adalah:

with open (file) as fp:
    s = fp.read()
    json.loads(s)

Itu sama untuk melakukan ini:

with open (file) as fp:
    json.load(fp)

Tetapi jika Anda perlu menentukan byte yang membaca dari file sebagai suka fp.read(10)atau string / byte yang Anda ingin deserialize bukan dari file, Anda harus menggunakan json.loads ()

Adapun json.loads (), itu tidak hanya deserialize string tetapi juga byte. Jika sbyte atau byte, itu akan diterjemahkan ke string terlebih dahulu. Anda juga dapat menemukannya di kode sumber.

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

Wenyi Li
sumber