Як розібрати JSON у Python

JSON – це широко застосовуваний формат для обміну даними. Python має вбудований модуль JSON, який дозволяє обробляти та аналізувати дані у форматі JSON. У цьому посібнику ви дізнаєтеся все необхідне про роботу з JSON у Python.

Після прочитання цього матеріалу ви зможете:

  • ознайомитися з основами JSON;
  • навчитися розбирати та генерувати JSON-рядки у Python;
  • дізнатися, як читати та записувати JSON-файли за допомогою Python.

Отже, почнемо! 🚀

Що таке JSON?

JSON, що розшифровується як JavaScript Object Notation, є текстовим форматом, призначеним для обміну даними. Хоча JSON спочатку базувався на об’єктах JavaScript, зараз майже всі мови програмування підтримують його використання.

Якщо вам доводилося працювати з API або аналізувати конфігураційні файли, то ви, скоріш за все, вже знайомі з JSON.

📝 Дані у форматі JSON передаються і приймаються при зверненні до API. JSON також широко використовується для взаємодії між клієнтом і сервером у різноманітних додатках. Крім цього, JSON можна використовувати для зберігання різноманітних даних.

Структура JSON дуже схожа на словник Python. Словники в Python – це потужна вбудована структура даних, де дані зберігаються у вигляді пар ключ-значення.

Перш ніж рухатися далі, варто звернути увагу на кілька важливих моментів:

  • В Python об’єкт JSON відображається як словник.
  • Масив JSON відображається як список Python.
  • Логічні значення в JSON (true і false) перетворюються в Python на True і False.

Для глибшого розуміння того, як різні типи даних перетворюються між JSON і Python, рекомендується ознайомитися з офіційною документацією.

Оскільки модуль json є частиною стандартної бібліотеки Python, немає потреби його встановлювати. Ви можете імпортувати його, як показано нижче:

import json

Як завантажити JSON-рядок у Python?

Для завантаження JSON-рядка у Python використовується наступний синтаксис:

<dict_obj> = json.loads(<json_str>)

де:

  • <dict_obj> – це словник Python, куди буде завантажений JSON-рядок;
  • <json_str> – це будь-який коректний JSON-рядок.

Таким чином, вміст <json_str> буде перетворено та збережено у словнику Python <dict_obj>.

Розглянемо приклад. json_str – це рядок, що містить JSON-дані:

json_str = """
{
    "books": [
        {
            "title": "The Wind in the Willows",
            "author": "Kenneth Grahame",
            "year": "1908"
        },
        {
            "title": "To the Lighthouse",
            "author": "Virginia Woolf",
            "year": "1927"
        }
    ]
}
"""

Нижче наведено фрагмент коду, який демонструє, як за допомогою методу loads() можна завантажити JSON-рядок json_str у словник Python. Ви можете перевірити, що py_dict дійсно є словником Python, скориставшись функцією type().

py_dict = json.loads(json_str)

type(py_dict)

# Output: dict

print(py_dict)

# Output
{'books': [{'title': 'The Wind in the Willows', 
'author': 'Kenneth Grahame', 'year': '1908'}, 
{'title': 'To the Lighthouse', 'author': 'Virginia Woolf', 'year': '1927'}]}

Як показано вище, усі поля з JSON-рядка стали парами ключ-значення у словнику py_dict.

Як створити JSON-рядок у Python?

Припустимо, у вас є словник Python і вам потрібно перетворити його на JSON-рядок. Як це зробити?

Для цього можна скористатися методом dumps() з наступним синтаксисом:

<json_str> = json.dumps(<dict_obj>)

де:

  • <dict_obj> – це словник Python, на основі якого потрібно створити JSON-рядок;
  • <json_str> – це отриманий JSON-рядок.

Отже, метод dumps() перетворює словник <dict_obj> на JSON-рядок <json_str>.

Давайте додамо до нашого існуючого словника Python py_dict новий ключ “movies”. Це можна зробити так:

py_dict["movies"] = [{"title":"The Imitation Game","year":"2014",
"lang":"en","watched":True}]

Тепер перетворимо оновлений словник у новий JSON-рядок json_str2, використовуючи метод dumps().

json_str2 = json.dumps(py_dict)

print(json_str2)

# Output
{"books": [{"title": "The Wind in the Willows", "author": "Kenneth Grahame", "year": "1908"}, 
{"title": "To the Lighthouse", "author": "Virginia Woolf", "year": "1927"}], 
"movies": [{"title": "The Imitation Game", "year": "2014", "lang": "en", "watched": true}]}

Як видно з прикладу вище, вихідний JSON-рядок без форматування важко читати. Щоб зробити його більш зрозумілим, можна використати додатковий параметр indent.

Задавши для indent ціле число, наприклад 2, ви отримаєте відформатований вивід, як показано нижче:

json_str2 = json.dumps(py_dict, indent = 2)
print(json_str2)

# Output
{
  "books": [
    {
      "title": "The Wind in the Willows",
      "author": "Kenneth Grahame",
      "year": "1908"
    },
    {
      "title": "To the Lighthouse",
      "author": "Virginia Woolf",
      "year": "1927"
    }
  ],
  "movies": [
    {
      "title": "The Imitation Game",
      "year": "2014",
      "lang": "en",
      "watched": true
    }
  ]
}

Зверніть увагу, як вивід був відформатований з відступами, що значно полегшує його сприйняття.

Зауваження: 💡 Якщо ви хочете, щоб ключі були відсортовані в алфавітному порядку, встановіть для параметра sort_keys значення True.

Як показано у фрагменті коду нижче, тепер ключі відсортовані в алфавітному порядку.

json_str2 = json.dumps(py_dict, indent = 2, sort_keys=True)
print(json_str2)

# Output
{
  "books": [
    {
      "author": "Kenneth Grahame",
      "title": "The Wind in the Willows",
      "year": "1908"
    },
    {
      "author": "Virginia Woolf",
      "title": "To the Lighthouse",
      "year": "1927"
    }
  ],
  "movies": [
    {
      "lang": "en",
      "title": "The Imitation Game",
      "watched": true,
      "year": "2014"
    }
  ]
}

Тепер ключі розташовані в алфавітному порядку: “author”, “title”, та “year”.

На даний момент ви навчилися працювати з JSON-рядками у Python. У наступному розділі ми розглянемо, як працювати з JSON-файлами.

Як читати JSON-файл у Python?

Для читання JSON-файлу у Python використовується наступний синтаксис:

json.load(<json-file>) 

# where <json-file> is any valid JSON file.

Зверніть увагу, що використовується метод load(), а не loads(). loads() використовується для завантаження JSON-рядка, тоді як load() – для завантаження JSON-файлу.

При роботі з файлами в Python рекомендується використовувати менеджери контексту. Ось приклад читання файлу без використання контекстного менеджера:

my_file = open('students.json','r')

contents = my_file.read()

print(contents)

file.close()

Якщо не закривати файл, це може призвести до витоку ресурсів.

Натомість при використанні контекстних менеджерів файли автоматично закриваються після завершення операцій. Ось як використовувати контекстний менеджер для читання файлів:

with open('students.json','r') as file:   
   data = json.load(file) 
   print(data) 

# Output 

{'students': [{'roll_num': 'cs27', 'name': 'Anna', 'course': 'CS'}, 
{'roll_num': 'ep30', 'name': 'Kate', 'course': 'PHY'}]}

При читанні файлу вкажіть режим читання, позначений літерою “r” у коді вище.

Зауваження: Для зручності роботи, переконайтеся, що ваш JSON-файл знаходиться в тій самій папці, що й ваш скрипт Python (наприклад, main.py), як показано на зображенні нижче. Якщо JSON-файл знаходиться в іншій папці, потрібно вказати повний шлях до нього.

Зображення: Як читати JSON-файл у Python

У наступному розділі ви дізнаєтеся, як записувати у JSON-файли. ✍

Як записувати у JSON-файл у Python?

Для запису в існуючий JSON-файл або для створення нового використовуйте метод dump(), як показано нижче:

json.dump(<dict_obj>,<json_file>)

# where <dict_obj> is a Python dictionary 

# and <json_file> is the JSON file 

Отже, синтаксис вище записує вміст словника <dict_obj> у JSON-файл <json_file>.

У попередніх розділах ми вже створили словник py_dict. Тепер давайте запишемо його у новий JSON-файл. Назвемо його new_file.json.

У наступному фрагменті коду показано, як використовувати функцію dump():

with open('new_file.json','w') as file:
  json.dump(py_dict,file)

Зверніть увагу, що відкриття файлу в режимі запису (“w”) перезапише його вміст, якщо такий файл вже існує. Якщо ж файл не існує, то він буде створений.

Після виконання коду ви побачите, що в поточній робочій директорії створено новий JSON-файл. Ви можете перевірити його вміст.

При запису у файли основна мета – це збереження даних. Якщо вам важливо зберегти форматування, ви також можете використовувати параметри indent та sort_keys.

Висновок

⏱️ Підіб’ємо підсумки.

У цьому посібнику ви дізналися:

  • основи JSON;
  • як використовувати методи loads() та load() для читання JSON-рядків та JSON-файлів відповідно;
  • як використовувати методи dumps() та dump() для перетворення словників Python у JSON-рядки та JSON-файли відповідно.

Сподіваємося, цей посібник був для вас корисним. Вдалих вам навчань!

Також ви можете скористатися різними онлайн інструментами для аналізу, форматування та перевірки JSON.