Просто добавлю простой пример к тому, что все объяснили,
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))
Я получил бы эту ошибку:
Ошибка типа: ожидаемая строка или буфер
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.loads
десериализации и десериализацию строки.
Другой пример,
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