Как анализировать файлы JSON с помощью Python? (Python JSONPath)

Как анализировать файлы JSON с помощью Python Программирование и разработка

В настоящее время JSON является одним из наиболее важных форматов для обмена данными между приложениями, особенно через Интернет. JSONPath — это язык выражений, который можно использовать для чтения определенных данных из объектов JSON. Мы познакомим вас с реализацией JSONPath на Python и объясним наиболее важные приложения на простых для понимания примерах.

Что такое Python JSONPath?

JSON — это межсистемный формат файла, который можно использовать для упрощения и оптимизации обмена структурированными данными между приложениями. Файлы JSON состоят из перечисленных пар ключ-значение. Значения могут принимать разные типы данных, как примитивные значения, так и объекты. Объекты, в свою очередь, могут содержать свои собственные пары ключ-значение. Поскольку JSON понимают почти все современные системы, его можно использовать для обмена данными между приложениями любого типа, как локально на машине, так и через Интернет.

Однако не каждому приложению всегда нужны все данные, записанные в файл JSON. В таких случаях JSONPath — хороший выбор. JSONPath — это язык выражений, который можно использовать для чтения определенной информации из объектов JSON. В большинстве языков программирования JSONPath необходимо импортировать из внешней библиотеки. Поскольку эти библиотеки должны быть реализованы отдельно для каждого языка, разные библиотеки или реализации могут незначительно отличаться друг от друга.

Модуль Python jsonpath-ng

jsonpath-ngвероятно, самая распространенная реализация JSONPath на Python. Существуют и другие реализации JSONPath для Python, такие как jsonpathи jsonpath-rw. Однако они менее популярны и всеобъемлющи, поэтому мы просто сосредоточимся на них jsonpath-ng.

Installation

jsonpath-ngвы можете установить его очень легко через вашу оболочку. Все, что вам нужно сделать, это pip install jsonpath-ngввести команду.

Syntax

С помощью JSONPath вы можете выполнять сложные запросы к объектам JSON. Чтобы сделать это возможным, модуль имеет несколько методов, операторов и атомарных выражений, которые можно использовать для выбора и запроса конкретных данных. Двумя наиболее важными методами JSONPath являются parse()и find(). С помощью parse()вы можете определить запросы, на которые затем можно ссылаться и которые можно повторять так часто, как вам нравится. С помощью find()вы можете выполнять эти запросы к данным JSON для извлечения конкретных значений. Пример ниже приведен для иллюстрации.

import json
import jsonpath_ng as jp
raw_data = '''
{
    "name": "Johannes",
    "alter": 30,
    "wohnort": "Bielefeld"
}
'''
json_object = json.loads(raw_data)
name_query = jp.parse("$.name")
result = name_query.find(json_object)

print(result[0].value) # Ausgabe: Johannes

В приведенном выше примере данные JSON в виде строки были преобразованы в объект словаря с помощью. Это формат, с которым лучше всего работает Python. При создании запроса, который должен возвращать значение «имя», было определено. Затем это было применено к объекту JSON. Результат запроса сохранялся в переменной и также считывался.json.loadsname_query»$.name«find()resultresult[0].value

Читайте также:  Как максимально эффективно использовать провайдеры контактов в Java и Android - исчерпывающее руководство

Метод find возвращает не только запрошенное значение, но и другую контекстную информацию, например путь к искомому значению. Эта информация возвращается в виде списка, где искомое значение имеет индекс 0. Соответственно, вы можете использовать для отображения искомое значение.result[0].value

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

Выражение/оператор Значение Пример Объяснение
$ корневой объект $.marcus.alter Получает доступ к значению ключа «возраст» из объекта «маркус».
. поле объекта $.marcus Доступ к marcus, где marcus — это поле корневого объекта.
.. Рекурсивный поиск поля. Также проверяются поля в подобъектах. $.people..alter Возвращает все вхождения поля «изменить» в «люди» и его подобъекты.
[x] элемент в массиве $.people[5] Доступ к шестому элементу (по индексу 5) в массиве людей.
* Заполнитель для числа, в основном используемый в связи с циклами for $.people[*] Доступ к полю в «людях». В сочетании с циклом for каждое поле будет возвращено по порядку.

В дополнение к выражениям и операторам есть несколько фильтров, которые можно использовать, чтобы сделать поиск еще более конкретным. Также в реализации JSONPath на Python они могут быть связаны с операторами Python. Все символы, которые можно использовать в связи с фильтрами, сведены с примерами в следующей таблице.

символы Значение Пример Объяснение
.[?(filter)] Общий синтаксис для фильтров. Скобки можно опустить. $.people[?(@.name == “Anne”)] Доступ к людям по имени «Энн».
@ Текущий исследуемый объект, часто используемый в сочетании с циклами for. $.people[?(@.alter < 50)] Доступ к полям у людей моложе 50 лет.
<, >, <=, и >=_==!= Операторы сравнения, которые можно использовать для фильтрации определенных результатов поиска. $.people[@.alter < 50 & @.alter > 20] Доступ к людям в возрасте от 20 до 50 лет.
& Логическое И. $.people[?(@.wohnort == ‘Berlin’ & @.alter > 40)] Доступ к людям старше 40 лет, проживающим в Берлине.
Читайте также:  Полное руководство по привязке данных в гибридных приложениях с основами и практическими советами

Пример приложения для Python JSONPath

import json
import jsonpath_ng as jp


import json
import jsonpath_ng as jp

# JSON-Daten als String
data = """
{
    "staedte": [
        {
            "name": "Berlin",
            "bundesland": "Berlin",
            "einwohner": 3645000,
            "istHauptstadt": true,
            "bezirk Pankow": {
                "einwohner": 410000    
            }
        },
        {
            "name": "Hamburg",
            "bundesland": "Hamburg",
            "einwohner": 1841000,
            "istHauptstadt": false
        },
        {
            "name": "Muenchen",
            "bundesland": "Bayern",
            "einwohner": 1472000,
            "istHauptstadt": false
        },
        {
            "name": "Koeln",
            "bundesland": "Nordrhein-Westfalen",
            "einwohner": 1086000
        }
    ]
}
"""

# Konvertiere data von String zu Dictionary
json_data = json.loads(data)

# Anfrage: Namen aller Städte
query1 = jp.parse("staedte[*].name")
for match in query1.find(json_data):
    print(match.value)     # Ausgabe: Berlin, Hamburg, Muenchen, Koeln

# jsonpath_ng.ext importieren, um Filter anzuwenden
import jsonpath_ng.ext as jpx

# Anfrage: Namen aller Städte, die weniger als 1,5 Millionen Einwohner haben 
query2 = jpx.parse("$.staedte[?@.einwohner < 1500000].name")
for match in query2.find(json_data):
    print(match.value)     # Ausgabe: Muenchen, Koeln

# Alle Felder, die mit "einwohner" beschriftet sind 
query3 = jp.parse("$.staedte..einwohner")
match = query3.find(json_data)
for i in match:
    print(i.value)     # Ausgabe: 3645000, 410000, 1841000, 1472000, 1086000

# Die Namen aller Städte, die nicht "Berlin" heißen
query4 = jpx.parse('$.staedte[?(@.name != "Berlin")].name')
for match in query4.find(json_data):
    print(match.value)     # Ausgabe: Hamburg, Muenchen, Koeln

В этом примере данные JSON указываются в виде строки, а затем преобразуются в объект словаря с помощью. В корневом объекте содержится только один массив, который, в свою очередь, содержит 4 города. Каждый город имеет 4 поля, содержащие следующие данные:loads()

  • название города
  • состояние города
  • количество жителей
  • Является ли город столицей Германии или нет

В качестве дополнительного поля в Берлине есть объект под названием «Район Панков», который также содержит подсчет населения.

После преобразования данных в подходящий формат выполняются 4 разных запроса, функционал и результаты которых оставлены в примере в виде комментариев. Вы наверняка заметите, что третий запрос вернул пять значений. Это потому, что оператор рекурсивно ищет совпадающие поля. Это означает, что проверяются все объекты, а также все дочерние объекты этих объектов. Соответственно, население Панкова указано рядом с населением городов.

Оцените статью
Блог о программировании
Добавить комментарий