Ответ 1
Да, s
обозначает строку. Функция json.loads
принимает не путь к файлу, а содержимое файла в виде строки. Посмотрите документацию на https://docs.python.org/2/library/json.html!
В Python, в чем разница между json.load()
и json.loads()
?
Я предполагаю, что функция load() должна использоваться с файловым объектом (мне нужно, таким образом, использовать менеджер контекста), в то время как функция load() принимает путь к файлу в виде строки. Это немного сбивает с толку.
Буква "s" в json.loads()
обозначает строку?
Большое спасибо за ваши ответы!
Да, s
обозначает строку. Функция json.loads
принимает не путь к файлу, а содержимое файла в виде строки. Посмотрите документацию на https://docs.python.org/2/library/json.html!
Документация совершенно ясна: 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 (a.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
Просто добавлю простой пример к тому, что все объяснили,
json.load()
json.load
может десериализовать сам файл, то есть он принимает объект file
,
with open("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
,
with open("json_data.json", "r") as content:
print(json.loads(content))
Я бы получил эту ошибку:
Ошибка типа: ожидаемая строка или буфер
json.loads()
json.loads()
десертилизировать строку.
используя 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()))
.