ความแตกต่างระหว่าง json.load () และ json.loads อะไร () ฟังก์ชั่น


173

ใน Python อะไรคือความแตกต่างระหว่างjson.load()และjson.loads()?

ฉันเดาว่าจะต้องใช้ฟังก์ชันload ()กับวัตถุไฟล์ (ฉันต้องใช้ตัวจัดการบริบท) ในขณะที่ฟังก์ชันload ()จะใช้พา ธ ไปยังไฟล์เป็นสตริง มันค่อนข้างสับสน

ไม่ตัวอักษร " s " ในการjson.loads()ยืนสำหรับสตริง ?

ขอบคุณมากสำหรับคำตอบของคุณ!


1
json.loads(s, *)- deserialize s(กstr, bytesหรือbytearrayอินสแตนซ์ที่มีเอกสาร JSON) - docs.python.org/3.6/library/json.html
deceze

คำตอบ:


160

ใช่sหมายถึงสตริง json.loadsฟังก์ชั่นไม่ได้ใช้เส้นทางของไฟล์ แต่เนื้อหาของแฟ้มเป็นสตริง ดูเอกสารประกอบได้ที่https://docs.python.org/2/library/json.html !


5
บทความที่เชื่อมโยงชี้ไปที่เวอร์ชันไพ ธ อนผิด คำถามถูกแท็กเป็น 2.7
RvdK

คำตอบจาก @Sufiyan Ghori ให้ตัวอย่างที่ดีนอกเหนือไปจากคำตอบสั้น ๆ แต่ตรงประเด็น
Wlad

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() ยกเลิกการ deserialize สตริง

ดังนั้นเพื่อที่จะใช้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' วัตถุไม่มีแอตทริบิวต์ 'อ่าน'

ดังนั้นตอนนี้คุณรู้จักjson.loadไฟล์json.loadsdeserialze และทำการดีซีเรียลไลซ์สตริง

ตัวอย่างอื่น,

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()))แทน


4
คำตอบที่ดีที่สุด (รายละเอียด) ควรได้รับการโหวตให้ตอบคำถามสั้น ๆ ร่วมกันพวกเขามีความแข็งแรง :-)
Wlad

เพียง FYI กับงูหลาม 3.6.5 with open()และjson.loads()ผลตอบแทนที่เป็นข้อยกเว้น:TypeError: the JSON object must be str, bytes or bytearray, not 'TextIOWrapper'
Sergiy Kolodyazhnyy

31

เอกสารชัดเจนมาก: 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 (.read () - รองรับวัตถุคล้ายไฟล์ที่มีเอกสาร JSON) ไปยังวัตถุ Python โดยใช้ตารางการแปลงนี้

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

Deserialize s (อินสแตนซ์ str หรือ unicode ที่มีเอกสาร JSON) ไปยังวัตถุ Python โดยใช้ตารางการแปลงนี้

ดังนั้นloadสำหรับไฟล์loadsสำหรับstring


1
"ไฟล์เหมือนวัตถุ" vs "อินสแตนซ์ของ str / unicode" ฉันไม่เข้าใจสิ่งที่ไม่ชัดเจน?
RvdK

7

ตอบด่วน (ง่ายมาก!)

json.load () รับไฟล์

json.load () คาดว่าจะมีไฟล์ (ไฟล์ object) - เช่นไฟล์ที่คุณเปิดรับก่อนโดย 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/ dumps& json.load/ loads bogotobogo.com/python/…
Wlad

1

วิธีการjson.load () (โดยไม่มี "s" ใน "load") สามารถอ่านไฟล์ได้โดยตรง:

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

ที่นี่เราจะเห็นหลังจากที่ใช้โหลด () ใช้เวลาสตริง (ชนิด (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 () มันไม่เพียง แต่ deserialize สตริง แต่ยังไบต์ ถ้าsเป็นไบต์หรือ ByteArray ก็จะถูกถอดรหัสสตริงแรก นอกจากนี้คุณยังสามารถหาได้ในรหัสที่มา

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.