Парсинг JSON-даних за допомогою Python

Як парсити JSON-дані за допомогою Python

JSON Дані JSON стали дуже популярними останніми роками. Вони прості й гнучкі, тож їх легко розуміти й розбирати як людям, так і машинам. Дані JSON складаються з пар «ключ-значення», укладених у фігурні дужки, а ключі та значення розділяються двокрапкою.

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

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

Що таке JSON?

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

Приклад JSON-даних

{
"name": "John",
"age": 30,
"city": "Нью-Йорк",
"skills": ["Python", "Django", "Машинне навчання"]
}

Навіщо використовувати JSON?

JSON популярний з кількох причин:

1. Human-Readable: Формат JSON легко читати й розуміти.

2. Lightweight: JSON-дані — це зазвичай компактніший ніж еквівалентні XML-дані.

3. Language-Independent: JSON можна розбирати й генерувати майже будь-якою мовою програмування.

4. Flexible: JSON підтримує вкладені структури та масиви, що робить його універсальним для представлення складних даних.

А тепер, перш ніж перейти до самого посібника, хочу згадати альтернативний варіант (не хвилюйтеся, я не отримую комісії, якщо ви зареєструєтеся) — Bright Data. Моя компанія використовує API для вебскрапінгу Bright Data для вебскрапінгу LinkedIn, і результати були винятковими.

Розбір JSON-даних у Python

Python’s standard library includes a module called `json` that makes it easy to work with JSON data. This module provides methods for parsing JSON data into Python objects and converting Python objects into JSON strings.

Loading JSON Data

The модуль `json` provides the `json.loads()` method for parsing JSON strings and `json.load()` for parsing JSON data from a file.

Parsing JSON String

To parse a JSON string, use the `json.loads()` method:

import json
json_string = '{"name": "John", "age": 30, "city": "New York"}'
data = json.loads(json_string)
print(data)
print(data['name'])

Розбір JSON із файла

To parse JSON data from a file, use the `json.load()` method:

import json
with open('data.json', 'r') as file:
data = json.load(file)
print(data)
print(data['age'])

Writing JSON Data

Модуль `json` також надає методи для перетворення об’єктів Python у JSON-рядки та запису JSON-даних у файл.

Перетворення об’єктів Python на рядки JSON

To convert a Python object into a JSON string, use the `json.dumps()` method:

import json
data = {
"name": "John",
"age": 30,
"city": "Нью-Йорк"
}
json_string = json.dumps(data)
print(json_string)

Запис JSON-даних у файл

Щоб записати JSON-дані у файл, використайте `json.dump()` method:

import json
data = {
"name": "John",
"age": 30,
"city": "Нью-Йорк"
}
with open('data.json', 'w') as file:
json.dump(data, file)

Опрацювання складних JSON-даних

JSON-дані можуть бути складними, з вкладеними об’єктами та масивами. Модуль Python `json` добре справляється з цими складнощами.

Nested JSON Objects

Розгляньте такі вкладені JSON-дані:

{
"name": "John",
"age": 30,
"address": {
"street": "123 Main St",
"city": "Нью-Йорк"
}
}

Щоб отримати доступ до вкладених даних, використовуйте відповідні ключі:

import json
json_string = '''
{
"name": "John",
"age": 30,
"address": {
"street": "123 Main St",
"city": "New York"
}
}
'''
data = json.loads(json_string)
print(data['address']['city'])

JSON Arrays

JSON також підтримує масиви, які можуть містити кілька об’єктів або значень:

{
"name": "John",
"age": 30,
"skills": ["Python", "Django", "Машинне навчання"]
}

Щоб отримати доступ до даних у масиві JSON, використовуйте індексацію:

import json
json_string = '''
{
"name": "John",
"age": 30,
"skills": ["Python", "Django", "Machine Learning"]
}
'''
data = json.loads(json_string)
print(data['skills'][0])

Обробка помилок під час парсингу JSON

Під час роботи з JSON-даними важливо обробляти можливі помилки, які можуть виникнути під час парсингу. Модуль `json` викидає окремі винятки для різних типів помилок.

Поширені помилки парсингу JSON

– `json.JSONDecodeError`: Raised when the JSON data is malformed.

– `TypeError`: Raised when attempting to serialize a non-serializable object.

Handling Exceptions

Щоб обробити ці винятки, використайте блок `try-except`:

import json
json_string = '{"name": "John", "age": 30, "city": "New York"'
try:
data = json.loads(json_string)
except json.JSONDecodeError as e:
print(f"JSONDecodeError: {e}")

Робота з API та JSON

Багато веб-API повертають дані у форматі JSON (наприклад, API Bright Data, який я використовую). Бібліотеку `requests` у Python зазвичай використовують для взаємодії з API. Подивімося, як отримувати та парсити JSON-дані з API.

Example: Отримання даних з API

import requests
response = requests.get('https://api.example.com/data')
data = response.json()
print(data)

In this example, the `response.json()` method directly parses the JSON data from the API response.

Взаємозамінність JSON і об’єктів Python

JSON (JavaScript Object Notation) is a string format used for data interchange that shares a similar syntax with Python’s dictionary object literal syntax. However, JSON is not the same as a Python dictionary. When JSON data is loaded into Python, it is converted into a Python object, typically a dictionary or list. This allows for manipulation using standard Python methods. To save data back to JSON format, the `json.dumps()` function is used. It’s crucial to remember this difference between the two formats.

Modifying JSON Data

Працюючи з JSON у Python, ви можете змінювати дані, додаючи, оновлюючи або видаляючи елементи. Ми використаємо вбудований пакет `json`, який надає базові функції, потрібні для виконання цих завдань.

Додавання елемента

Щоб додати елемент до JSON-об’єкта, можна використати стандартний синтаксис словника:

import json
json_string = '{"model": "Model X", "year": 2022}'
json_data = json.loads(json_string)
json_data['color'] = 'red'
print(json_data) # Output: {'model': 'Model X', 'year': 2022, 'color': 'red'}

Оновлення елемента

Оновлення елемента полягає в заміні значення наявного ключа:

import json
json_string = '{"model": "Model X", "year": 2022}'
json_data = json.loads(json_string)
json_data['year'] = 2023
print(json_data) # Вивід: {'model': 'Model X', 'year': 2023}

Інший спосіб додавання або оновлення значень у словнику — використати метод `update()`. Цей метод додає або оновлює елементи, використовуючи значення з іншого словника або з ітерабельного об’єкта, що містить пари ключ-значення:

import json
json_string = '{"model": "Model X", "year": 2022}'
json_data = json.loads(json_string)
more_json_string = '{"model": "Model S", "color": "Red"}'
more_json_data = json.loads(more_json_string)
json_data.update(more_json_data)
print(json_data) # Output: {'model': 'Model S', 'year': 2022, 'color': 'Red'}

Видалення елемента

Щоб видалити елемент з JSON-об’єкта, використайте ключове слово `del`:

import json
json_string = '{"model": "Model X", "year": 2022}'
json_data = json.loads(json_string)
del json_data['year']
print(json_data) # Output: {'model': 'Model X'}

Або ж можна використати метод `pop()`, який одночасно повертає значення та видаляє його:

import json
json_string = '{"model": "Model X", "year": 2022}'
json_data = json.loads(json_string)
year = json_data.pop('year')
print(year) # Output: 2022
print(json_data) # Output: {'model': 'Model X'}

Якщо елемент відсутній, використання `del` спричинить виняток `KeyError`. Метод `pop()` поверне `None`, якщо ключ не знайдено. Щоб безпечно використовувати `del`, перевірте, чи існує ключ, або загорніть операцію в блок `try-except`:

import json
json_string = '{"model": "Model X", "year": 2022}'
json_data = json.loads(json_string)
if 'year' in json_data:
del json_data['year']
else:
print('Ключ не знайдено')
# or wrapping the del operation with try-except
try:
del json_data['year']
except KeyError:
print('Ключ не знайдено')

Python Error Handling: Check or Ask?

У Python обробку помилок можна реалізувати двома підходами: «перевір перед стрибком» і «попроси прощення». Перший перевіряє стан програми перед виконанням кожної операції, тоді як другий спершу намагається виконати операцію й перехоплює будь-які винятки, якщо вона не вдається. Підхід «попроси прощення» у Python трапляється частіше, виходячи з того, що помилки є звичною частиною виконання програми. Він дає елегантний спосіб обробки помилок і робить код легшим для читання та написання.

Saving JSON

After modifying JSON data, you may want to save it back to a JSON file or export it as a JSON string. The `json.dump()` method saves a JSON object to a file, while `json.dumps()` returns a JSON string representation of an object.

Збереження JSON у файл

Using `json.dump()` with the `open()` context manager in write mode:

import json
data = {"model": "Model X", "year": 2022}
with open("data.json", "w") as f:
json.dump(data, f)

Перетворення об’єкта Python на JSON-рядок

Using `json.dumps()` to convert a dictionary to a JSON string representation:

import json
data = {"model": "Model X", "year": 2022}
json_string = json.dumps(data)
print(json_string) # Output: {"model": "Model X", "year": 2022}

Просунуті техніки парсингу JSON

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

Custom Decoders

You can define custom decoding behavior by subclassing `json.JSONDecoder`:

import json
class CustomDecoder(json.JSONDecoder):
def decode(self, s):
data = super().decode(s)
# Add custom decoding logic here
return data
json_string = '{"name": "John", "age": 30}'
data = json.loads(json_string, cls=CustomDecoder)
print(data)

Розбір великих JSON-файлів

Для дуже великих JSON-файлів варто розглянути бібліотеку `ijson`, яка розбирає JSON-дані інкрементально:

import ijson
with open('large_data.json', 'r') as file:
parser = ijson.items(file, 'елемент')
for item in parser:
print(елемент)

Conclusion

Розбір JSON-даних у Python простий завдяки модулю `json`. Незалежно від того, чи працюєте ви з базовими JSON-рядками, чи зі складними вкладеними структурами, Python має інструменти, потрібні для ефективного розбору, перетворення та запису JSON-даних. Опанувавши основи й дослідивши просунуті техніки, ви зможете ефективно керувати обміном даними у своїх Python-застосунках.

У цьому посібнику я розглянув основи читання та розбору JSON-даних за допомогою Python. Я показав, як отримувати доступ до JSON-даних і змінювати їх за допомогою вбудованого пакета json у Python. Також ми розглянули більш просунуті варіанти розбору, які корисні для вебскрапінгу.

Маєте запитання? Напишіть у коментарях нижче!

Схожі записи