Подтвердить что ты не робот

В чем разница между функциями json.load() и json.loads()

В Python, в чем разница между json.load() и json.loads()?

Я предполагаю, что функция load() должна использоваться с файловым объектом (мне нужно, таким образом, использовать менеджер контекста), в то время как функция load() принимает путь к файлу в виде строки. Это немного сбивает с толку.

Буква "s" в json.loads() обозначает строку?

Большое спасибо за ваши ответы!

4b9b3361

Ответ 1

Да, s обозначает строку. Функция json.loads принимает не путь к файлу, а содержимое файла в виде строки. Посмотрите документацию на https://docs.python.org/2/library/json.html!

Ответ 2

Документация совершенно ясна: 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

Ответ 3

Просто добавлю простой пример к тому, что все объяснили,

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())).