Dodam tylko prosty przykład do tego, co wszyscy wyjaśnili,
json.load ()
json.loadmoże sam deserializować plik, tzn. akceptuje fileobiekt, na przykład
# 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))
wyjdzie,
{u'event': {u'id': u'5206c7e2-da67-42da-9341-6ea403c632c7', u'name': u'Sufiyan Ghori'}}
Jeśli json.loadszamiast tego użyję do otwarcia pliku,
# you cannot use json.loads on file object
with open("json_data.json", "r") as content:
print(json.loads(content))
Otrzymałbym ten błąd:
TypeError: oczekiwany ciąg lub bufor
json.loads ()
json.loads() ciąg deserializacji.
Żeby więc skorzystać json.loadsbędę musiał przekazać zawartość pliku za pomocą read()funkcji np.
korzystanie content.read()ze json.loads()zwrotem zawartości pliku,
with open("json_data.json", "r") as content:
print(json.loads(content.read()))
Wynik,
{u'event': {u'id': u'5206c7e2-da67-42da-9341-6ea403c632c7', u'name': u'Sufiyan Ghori'}}
Dzieje się tak, ponieważ typ content.read()to string, tj<type 'str'>
Jeśli używam json.load()z content.read(), otrzymam błąd,
with open("json_data.json", "r") as content:
print(json.load(content.read()))
Daje,
AttributeError: obiekt „str” nie ma atrybutu „odczyt”
Więc teraz znasz json.loadplik json.loadsdeserialze i deserializujesz ciąg.
Inny przykład,
sys.stdinzwraca fileobiekt, więc jeśli to zrobię print(json.load(sys.stdin)), otrzymam aktualne dane json,
cat json_data.json | ./test.py
{u'event': {u'id': u'5206c7e2-da67-42da-9341-6ea403c632c7', u'name': u'Sufiyan Ghori'}}
Jeśli chcę użyć json.loads(), zrobiłbym to print(json.loads(sys.stdin.read()))zamiast tego.
json.loads(s, *)- Cofnięcies(astr,byteslubbytearrayprzykład zawierającego dokument JSON) - docs.python.org/3.6/library/json.html