Просто додамо простий приклад до того, що всі пояснили,
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.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()))замість цього.
json.loads(s, *)- Deserializes(аstr,bytesабоbytearrayпримірник , що містить JSON документ) - docs.python.org/3.6/library/json.html