December 20, 2022

JSONPath

pip install jsonpath-rw

import json
from jsonpath_rw import jsonpath, parse

# Парсинг JSON-строки и сохранение результата в виде Python-объекта
data = json.loads('{"store":{"book":[{"title":"The Alchemist","price":8.95}]}}')

# Создание JSONPath-выражения для извлечения значений ключа "title"
expression = parse('$.store.book[*].title')

# Извлечение значений с помощью JSONPath-выражения
titles = [match.value for match in expression.find(data)]
print(titles)  # ['The Alchemist']

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

Чтобы использовать JSONPath Online Evaluator, нужно следующее:

  1. Перейдите на сайт, на котором размещен инструмент. В поисковой строке введите "JSONPath Online Evaluator" и нажмите Enter.
  2. В поле "Input" введите JSON-документ, который Вы хотите анализировать. Это может быть любая JSON-структура, например:
{
  "store": {
    "book": [
      {
        "category": "reference",
        "author": "Nigel Rees",
        "title": "Sayings of the Century",
        "price": 8.95
      },
      {
        "category": "fiction",
        "author": "Evelyn Waugh",
        "title": "Sword of Honour",
        "price": 12.99
      },
      {
        "category": "fiction",
        "author": "Herman Melville",
        "title": "Moby Dick",
        "isbn": "0-553-21311-3",
        "price": 8.99
      },
      {
        "category": "fiction",
        "author": "J. R. R. Tolkien",
        "title": "The Lord of the Rings",
        "isbn": "0-395-19395-8",
        "price": 22.99
      }
    ],
    "bicycle": {
      "color": "red",
      "price": 19.95
    }
  },
  "expensive": 10
}

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

$.store.book[?(@.category == 'fiction')]

В этом JSONPath-запросе используется фильтрующее выражение [?(@.category == 'fiction')], которое выбирает только те книги, у которых поле "category" равно "fiction".

Общий синтаксис фильтрующего выражения такой:

[?(<условие>)]

Где условие - это логическое выражение, которое возвращает true или false. Если условие верно, то элемент включается в результат, иначе он исключается.

В нашем случае условием является @.category == 'fiction', которое сравнивает значение поля "category" со строкой "fiction". Оператор @ указывает на текущий элемент (в данном случае - книгу), а оператор == сравнивает два значения на равенство. Если значение поля "category" равно "fiction", то условие верно и элемент включается в результат.

  1. Специальный символ $ указывает на корневой элемент документа. Например, чтобы выбрать весь документ, можно использовать запрос $.
  2. Символ @ указывает на текущий элемент. Например, чтобы выбрать все значения поля "title", можно использовать запрос $.store.book[*].title.
  3. Символ * означает "все элементы". Например, чтобы выбрать все книги, можно использовать запрос $.store.book[*].
  4. Символ .. означает "рекурсивно все элементы". Например, чтобы выбрать все элементы во всех вложенных объектах, можно использовать запрос $..*.
  5. Фильтрующие выражения могут быть использованы для выборки элементов с определенными свойствами. Фильтрующие выражения выглядят так: [?(<условие>)], где условие - это логическое выражение

  1. Символ [<индекс>] позволяет выбирать элемент по его индексу в массиве. Например, чтобы выбрать вторую книгу, можно использовать запрос $.store.book[1].
  2. Символ [<start>:<end>] позволяет выбирать срез элементов массива. Например, чтобы выбрать вторую и третью книгу, можно использовать запрос $.store.book[1:3].
  3. Символ [-<n>] позволяет выбирать последние n элементов массива. Например, чтобы выбрать последние две книги, можно использовать запрос $.store.book[-2:].

Помимо этих символов, JSONPath также поддерживает различные функции, которые можно использовать для обработки данных. Например, функция length() возвращает количество элементов в массиве.

  1. Выбрать все книги, у которых поле "category" равно "fiction": $.store.book[?(@.category == 'fiction')]
  2. Выбрать названия всех книг: $.store.book[*].title
  3. Выбрать все цены книг: $..price
  4. Выбрать первую книгу: $.store.book[0]
  5. Выбрать последнюю книгу: $.store.book[-1:]
  6. Выбрать вторую и третью книгу: $.store.book[1:3]
  7. Выбрать все книги, у которых указан идентификатор ISBN: $.store.book[?(@.isbn)]
  8. Выбрать все авторы книг: $..author
  9. Выбрать все элементы во всех вложенных объектах: $..*
  10. Выбрать количество книг: length($.store.book)

Чтобы совместить оба примера запроса JSONPath, нужно объединить условия фильтрации с помощью логического оператора AND (&&). Получится следующий запрос:

$.store.book[?(@.price < 10 && (@.category == 'reference' || @.category == 'fiction'))]

Этот запрос выберет все книги, у которых цена меньше 10 долларов и категория равна "reference" или "fiction".

Обратите внимание, что условие @.category == 'reference' || @.category == 'fiction' нужно обернуть в скобки, так как это объединение двух условий с помощью логического оператора OR.

  1. Выбрать весь документ: $
  2. Выбрать все значения поля "name": $.name
  3. Выбрать все элементы массива: $.array[*]
  4. Выбрать первый элемент массива: $.array[0]
  5. Выбрать все элементы массива, у которых поле "enabled" равно true: $.array[?(@.enabled)]
  6. Выбрать все элементы массива с четным индексом: `$.array[0,2,4,6,8]

  1. Выбрать все элементы массива с нечетным индексом: $.array[1,3,5,7,9]
  2. Выбрать второй и третий элементы массива: $.array[1:3]
  3. Выбрать последний элемент массива: $.array[-1:]
  4. Выбрать все элементы массива, у которых поле "type" равно "primary" или "secondary": $.array[?(@.type == 'primary' || @.type == 'secondary')]
  5. Выбрать все элементы массива, у которых поле "type" равно "primary" и поле "enabled" равно true: $.array[?(@.type == 'primary' && @.enabled)]
  6. Выбрать все значения поля "name" у элементов массива: $.array[*].name
  7. Выбрать все значения поля "value" во всех вложенных объектах: $..value
  8. Выбрать все элементы массива, у которых поле "name" содержит строку "item": $.array[?(@.name.contains('item'))]
  9. Выбрать количество элементов массива: length($.array)

  1. Выбрать все элементы массива, у которых поле "name" начинается со строки "item": $.array[?(@.name.startsWith('item'))]
  2. Выбрать все элементы массива, у которых поле "name" заканчивается строкой "item": $.array[?(@.name.endsWith('item'))]
  3. Выбрать все элементы массива, у которых поле "value" является числом: $.array[?(@.value.isNumber())]
  4. Выбрать все элементы массива, у которых поле "value" является строкой: $.array[?(@.value.isString())]
  5. Выбрать все элементы массива, у которых поле "value" является логическим значением: $.array[?(@.value.isBoolean())]
  6. Выбрать все элементы массива, у которых поле "value" является массивом: $.array[?(@.value.isArray())]
  7. Выбрать все элементы массива, у которых поле "value" является объектом: $.array[?(@.value.isObject())]
  8. Выбрать все элементы массива, у которых поле "value" является null: $.array[?(@.value.isNull())]
  9. Выбрать первый элемент массива с помощью функции head(): $.array[0]
  10. Выбрать все элементы массива, кроме первого с помощью функции tail(): $.array[1:]