Работа с текстовым форматом JSON в языке Python

Формат JSON изначально использовался для описания объектов, которые существует в JavaScript. Сейчас он является отдельным текстовым форматом. В JSON описываются такие основные сущности как числа, строки, списки, объекты (словари, которые хранят в себе пару ключ-значение), также мы храним значения true/false и null, что является аналогом None в языке Python.

[
  {
    "first_name": "Greg",
    "last_name": "Dean",
    "certificate": true,
    "scores": [
        70,
        80,
        90
    ],
    "description": "Good job, Greg"
  },
  {
    "first_name": "Wirt",
    "last_name": "Wood",
    "certificate": true,
    "scores": [
        70,
        80,
        90
    ],
    "description": "Nicely Done"
  }
]

Каждой сущности в JSON есть аналог в Python. Ключом в JSON-объекте может быть только строка. Значения true и false пишутся с маленькой буквы. А значению None будет соответствовать значение null. Строки можно объявить только внутри двойных кавычек.

Для того чтобы считывать и записывать данные в JSON-формате в языке Python существует библиотека json.

Функция dumps принимает первым аргументом объект языка Python и возвращает соответствующее ему строковое представление в формате JSON. Также ей передается количество отступов, которое нужно использовать. И еще можно отсортировать ключи каждого словаря, который попадается в данном объекте.
import json
student1 = {
    'first_name': 'Greg',
    'last_name': 'Dean',
    'scores': [70, 80, 90],
    'description': "Good job, Greg",
    'certificate': True
}

student2 = {
    'first_name': 'Wirt',
    'last_name': 'Wood',
    'scores': [80, 80.2, 80],
    'description': "Nicely Done",
    'certificate': True
}

data = [student1, student2]
data_json = json.dumps(data, indent=4, sort_keys=True)

Для записи в файл можно использовать функцию dump:
with open("students.json", "w") as f:
    json.dump(data, f, indent=4, sort_keys=True)

Чтобы получить объект языка Python соответствующий строковому представлению в формате JSON можно использовать функцию loads:
data = [student1, student2]
data_json = json.dumps(data, indent=4, sort_keys=True)
data_again = json.loads(data_json)
print(sum(data_again[0]["scores"]))

Чтобы считать данные из JSON-файла можно использовать функцию load:
with open("students.json", "r") as f:
    data_again = json.load(f)
    print(sum(data_again[1]["scores"]))


2 комментария:

  1. Если файл students.json пустой, то

    with open("students.json", "r") as f:
    data_again = json.load(f)

    выдаст ошибку, верно?

    ОтветитьУдалить
    Ответы
    1. Да, совершенно верно:

      Traceback (most recent call last):
      File "myexample.py", line 3, in
      data_again = json.load(f)
      File "/usr/lib/python3.5/json/__init__.py", line 268, in load
      parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
      File "/usr/lib/python3.5/json/__init__.py", line 319, in loads
      return _default_decoder.decode(s)
      File "/usr/lib/python3.5/json/decoder.py", line 339, in decode
      obj, end = self.raw_decode(s, idx=_w(s, 0).end())
      File "/usr/lib/python3.5/json/decoder.py", line 357, in raw_decode
      raise JSONDecodeError("Expecting value", s, err.value) from None

      Удалить