Парсинг JSON с помощью Python

Как разобрать JSON-данные с помощью Python

JSON За последние годы JSON стал очень популярен. Он прост и гибок, поэтому его легко понимать и обрабатывать как людям, так и машинам. Данные JSON состоят из пар ключ-значение, заключённых в фигурные скобки, где ключи и значения разделяются двоеточием.

Python В Python есть множество инструментов, библиотек и методов для работы с JSON-данными. Это делает Python популярным выбором для аналитиков данных, веб-разработчиков и дата-сайентистов.

В этом руководстве я разберу основы синтаксиса JSON и типы данных. Я также расскажу о библиотеках и методах Python, которые можно использовать для разбора JSON-данных. Мы рассмотрим и более продвинутые варианты, которые отлично подходят для веб-скрапинга данных.

Что такое JSON?

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

Пример JSON-данных

{
"имя": "John",
"age": 30,
"city": "New York",
"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

Сайт `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:

импорт json
json_string = '{"name": "John", "age": 30, "city": "New York"}'
data = json.loads(json_string)
печать(данные)
печать(data['name'])

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

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

импорт json
с открыть('data.json', 'r') в роли file:
data = json.load(file)
печать(данные)
печать(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:

импорт json
data = {
"имя": "John",
"age": 30,
"city": "New York"
}
json_string = json.dumps(data)
печать(json_string)

Запись данных JSON в файл

Чтобы записать JSON-данные в файл, используйте `json.dump()` method:

импорт json
data = {
"имя": "John",
"age": 30,
"city": "New York"
}
с открыть('data.json', 'w') в роли file:
json.dump(data, file)

Работа со сложными JSON-данными

Данные JSON могут быть сложными, с вложенными объектами и массивами. Модуль `json` в Python хорошо справляется с такими случаями.

Nested JSON Objects

Рассмотрим следующие вложенные JSON-данные:

{
"имя": "John",
"age": 30,
"адрес": {
"street": "123 Main St",
"city": "New York"
}
}

Чтобы получить доступ к вложенным данным, используйте соответствующие ключи:

импорт json
json_string = '''
{
"name": "John",
"age": 30,
"address": {
"street": "123 Main St",
"city": "New York"
}
}
'''
data = json.loads(json_string)
печать(data['address']['city'])

JSON Arrays

JSON также поддерживает массивы, которые могут содержать несколько объектов или значений:

{
"имя": "John",
"age": 30,
"skills": ["Python", "Django", "Машинное обучение"]
}

Чтобы получить доступ к данным в JSON-массиве, используйте индексацию:

импорт json
json_string = '''
{
"name": "John",
"age": 30,
"skills": ["Python", "Django", "Machine Learning"]
}
'''
data = json.loads(json_string)
печать(data['skills'][0])

Обработка ошибок при парсинге JSON

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

Распространенные ошибки при разборе JSON

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

– `TypeError`: возникает при попытке сериализовать несериализуемый объект.

Handling Exceptions

Чтобы обработать эти исключения, используйте блок try-except:

импорт json
json_string = '{"name": "John", "age": 30, "city": "New York"'
попробуйте:
data = json.loads(json_string)
кроме json.JSONDecodeError в роли e:
печать(f"JSONDecodeError: {e}")

Работа с API и JSON

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

Пример: Получение данных из API

импорт requests
response = requests.get('https://api.example.com/data')
data = response.json()
печать(данные)

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-объект, можно использовать стандартный синтаксис словаря:

импорт json
json_string = '{"model": "Model X", "year": 2022}'
json_data = json.loads(json_string)
json_data['color'] = 'red'
печать(json_data) # Output: {'model': 'Model X', 'year': 2022, 'color': 'red'}

Обновление элемента

Обновление элемента заключается в замене значения существующего ключа:

импорт json
json_string = '{"model": "Model X", "year": 2022}'
json_data = json.loads(json_string)
json_data['year'] = 2023
печать(json_data) # Output: {'model': 'Model X', 'year': 2023}

Еще один способ добавить или обновить значения в словаре — использовать метод `update()`. Он добавляет или обновляет элементы на основе данных из другого словаря или итерируемого объекта, содержащего пары ключ-значение:

импорт 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)
печать(json_data) # Output: {'model': 'Model S', 'year': 2022, 'color': 'Red'}

Удаление элемента

Чтобы удалить элемент из JSON-объекта, используйте ключевое слово `del`:

импорт json
json_string = '{"model": "Model X", "year": 2022}'
json_data = json.loads(json_string)
del json_data['year']
печать(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:

импорт json
json_string = '{"model": "Model X", "year": 2022}'
json_data = json.loads(json_string)
если 'year' в json_data:
del json_data['year']
else:
печать('Ключ не найден')
# or wrapping the del operation with try-except
попробуйте:
del json_data['year']
кроме KeyError:
печать('Ключ не найден')

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:

импорт json
data = {"model": "Model X", "year": 2022}
с открыть("data.json", "w") в роли f:
json.dump(data, f)

Преобразование объекта Python в JSON-строку

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

импорт json
data = {"model": "Model X", "year": 2022}
json_string = json.dumps(data)
печать(json_string) # Output: {"model": "Model X", "year": 2022}

Продвинутые техники парсинга JSON

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

Custom Decoders

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

импорт json
класс CustomDecoder(json.JSONDecoder):
def decode(self, s):
data = super().decode(s)
# Add custom decoding logic here
возврат data
json_string = '{"name": "John", "age": 30}'
data = json.loads(json_string, cls=CustomDecoder)
печать(данные)

Разбор больших JSON-файлов

Для очень больших JSON-файлов рассмотрите библиотеку `ijson`, которая разбирает JSON-данные инкрементально:

импорт ijson
с открыть('large_data.json', 'r') в роли file:
parser = ijson.items(file, 'item')
для пункт в parser:
печать(элемент)

Заключение

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

В этом руководстве я разобрал основы чтения и разбора JSON-данных в Python. Я показал, как получать доступ к JSON-данным и изменять их с помощью встроенного модуля json в Python. Мы также рассмотрели более продвинутые варианты парсинга, полезные для веб-скрапинга.

Есть вопросы? Оставьте комментарий ниже!

Похожие записи