Примеры использования JSONPath в Python

Перевод статьи Python JSONPath Examplesopen in new window.

Что такое JSONPath?

JSONPath это язык запросов к JSON. Он очень похож на язык запросов XPath для XML. Вы формируете строку запроса и получаете нужное значение. Такое подход экономит память, так как необходимости разбазарить JSON полностью.

Библиотеки Python для JSONPath

Существует много JSONPath-библиотек для Python.

jsonpathopen in new window: это портированая из Perl и JavaScript версия JSONPath.

jsonpath-rwopen in new window: полностью Python-реализация JSONPath. Объект выражения JSONPath это объект первого класса, простой для анализа, преобразования, обработки, печати и расширения. Модуль jsonpath-rw-extopen in new window расширяет функционал библиотеки.

jsonpath-ngopen in new window: окончательная реализация JSONPath цель которой соответствие стандарту, включая арифметические и бинарные сравнения. Эта библиотека соединяет модули jsonpath-rw и jsonpath-rw-ext и расширяет их.

Какую библиотеку использовать?

Модуль jsonpath-ng самый развитый и написан на чистом Python. Он поддерживает Python 2 и Python 3. Мы будем использовать этот модуль для примеров.

Установка модуля:

pip3.7 install jsonpath-ng
1

Разбор JSON

Рассмотрим пример разбора JSON и получения значения требуемого атрибута.

import json

from jsonpath_ng import jsonpath, parse

json_string = '{"id":1, "name":"Pankaj"}'
json_data = json.loads(json_string)

jsonpath_expression = parse('$.id')

match = jsonpath_expression.find(json_data)

print(match)
print("id value is", match[0].value)
1
2
3
4
5
6
7
8
9
10
11
12
13

Вывод программы:

[DatumInContext(value=1, path=Fields('id'), context=DatumInContext(value={'id': 1, 'name': 'Pankaj'}, path=Root(), context=None))]
id value is 1
1
2

Мы используем модуль json для преобразования строки JSON в словарь.

Расписка списка

Ключи JSON могут содержать списки значений. Мы можем использовать JSONPath для анализа списоков и получения значений.

Предположим, что у нас есть JSON-файл db.json с следующим содержимым:

{
  "employees": [
    {
      "id": 1,
      "name": "Pankaj",
      "salary": "10000"
    },
    {
      "name": "David",
      "salary": "5000",
      "id": 2
    }
  ]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

Мы хотим разобрать этот JSON-файл и получить список идентификаторов сотрудников.

import json
from jsonpath_ng import jsonpath, parse

with open("db.json", 'r') as json_file:
    json_data = json.load(json_file)

print(json_data)

jsonpath_expression = parse('employees[*].id')

for match in jsonpath_expression.find(json_data):
    print(f'Employee id: {match.value}')
1
2
3
4
5
6
7
8
9
10
11
12

Вывод программы:

{'employees': [{'id': 1, 'name': 'Pankaj', 'salary': '10000'}, {'name': 'David', 'salary': '5000', 'id': 2}]}
Employee id: 1
Employee id: 2
1
2
3

Рекомендовано к чтению Python f-strings – PEP 498 – Literal String Interpolationopen in new window.

Для получения данных в виде списка используйте генератор списков:

emp_ids_list = [match.value for match in jsonpath_expression.find(json_data)]
print(emp_ids_list)  # [1, 2]
1
2

Заключение

JSONPath предоставляет простой способ разбора JSON и извлечения конкретных значений. Это очень полезно когда данных в JSON много, а нам интересны только некоторые значения.

Последниее изменение: 24.08.2023, 06:42:55