Dodam tylko prosty przykład do tego, co wszyscy wyjaśnili,
json.load ()
json.load
może sam deserializować plik, tzn. akceptuje file
obiekt, 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.loads
zamiast 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.loads
bę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.load
plik json.loads
deserialze i deserializujesz ciąg.
Inny przykład,
sys.stdin
zwraca file
obiekt, 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
,bytes
lubbytearray
przykład zawierającego dokument JSON) - docs.python.org/3.6/library/json.html