Преобразование JSON и обеспечение его читабельности с помощью jq
Программирование

Преобразование JSON и обеспечение его читабельности с помощью jq

Вам нужно отсортировать тонну данных в формате JSON? Узнайте, как сделать его читабельным и полезным с помощью jq

JavaScript Object Notation (JSON) – один из самых популярных в мире форматов данных. Он имеет широкую поддержку и простую спецификацию. С ним легко работать во многих языках программирования, особенно в тех, которые предназначены для веб-разработки

Но ручная проверка данных JSON остается неудобной. Несмотря на то, что это человекочитаемый текстовый формат, набор данных JSON может содержать огромное количество данных. Источники не всегда форматируют JSON в удобной для чтения форме

javaИнструмент jq позволяет пользователям форматировать, фильтровать и преобразовывать данные JSON

Что такое jq?

Поскольку это инструмент командной строки, вы обычно используете jq, набирая команды в терминале. Существует также отличная онлайн-игра, о которой мы подробно расскажем ниже

Обычная работа вращается вокруг фильтров и применения фильтра к некоторому входному JSON. Вы можете использовать jq для получения одного элемента из множества других. Или вы можете удалить определенные поля из каждого элемента набора, упростив данные. Вы даже можете выполнять сложные операции для преобразования входных данных в другую форму

Как загрузить и установить jq

Программа jq не имеет внешних зависимостей, что означает, что ее очень легко запустить. Начните с загрузки исполняемого двоичного файла для Linux, macOS или Windows с помощью кнопки на домашней странице jq. После загрузки программы вы можете запустить ее прямо из командной строки. Для удобства вы можете переименовать ее ( mv jq-osx-amd64 jq ) и сделать исполняемой ( chmod +x jq )

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

$./jq

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

jq - commandline JSON processor  version 1. 6 

Если вам трудно справиться с вышеописанным подходом, есть альтернативы. В программе jq есть поддержка распространенных менеджеров пакетов, а пока вы всегда можете поэкспериментировать в онлайн песочнице

Базовое использование jq

Стандартное использование:

jq  options  <jq filter>  file. 

Так, например:

$ jq'.'data.json

Вы также можете передать ввод через другую команду, как показано ниже:

echo'{'name':'john'}'| jq'.'

  'name''john'

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

Фильтр, показанный в этих примерах, является самым простым из возможных, .(точка) , который печатает входные данные в упрощенном виде. Это уже довольно полезно, но фильтры jq предоставляют гораздо больше возможностей, чем это

Как применять базовые фильтры к JSON с помощью jq

Фильтр jq немного похож на селектор CSS или выражение XPATH. Это одно длинное выражение, состоящее из более мелких частей. Полный фильтр может выглядеть сложным, но после изучения основ каждая часть будет понятна

Работа с объектами

Вы можете получить значение свойства объекта, используя синтаксис .property :

echo'{'name':'john'}'| jq'.name'
'john'

Эта цепочка может использоваться для доступа к глубоко вложенным структурам:

echo'{'name':{'first':'john','last':'smith'}}'| jq'.name.last'
'smith'

Работа с массивами

Простейшая операция с массивом возвращает один элемент по его индексу:

echo' 1,2,3 '| jq'. 2 '

Обратите внимание, что, как и в большинстве языков программирования, jq индексирует массивы, начиная с позиции 0. Вы также можете разрезать подмассив, используя этот синтаксис:

echo' 1,2,3 '| jq'. 1:3 '

  2,
  3

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

echo' 1,2,3 '| jq'.  '

Это важный метод для объединения фильтров в цепочки, который мы покажем позже

Дополнительные возможности

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

Эти функции делают возможным расширенное использование, хотя и сложным. Но в jq есть встроенные функции и операторы, которые помогают решать даже простые задачи. Вот пример:

echo' 2,4,8 '| jq'add / length'
4. 666666666666667

Этот фильтр подает входные данные в функции add и length , разделяя результаты. В процессе работы он вычисляет среднее значение массива чисел

Оператор деления также может действовать на строки, чтобы разделить их на основе разделителя:

echo''Just testing''| jq'. / ' ''

  'Just'
  'testing'

Функция select фильтрует массив, сохраняя только те элементы, которые соответствуют заданному ограничению:

echo' 2,4,8 '| jq'.   | select(. >= 3)'

Обратите внимание, что это также пример использования оператора pipe ( | ) в jq, который похож на pipe в shell. Он подает результат левого фильтра в качестве входного сигнала для правого фильтра

Функция map очень полезна при работе с массивами. Она выполняет операцию над каждым элементом массива, а не над всем массивом:

echo' 1,2,3 '| jq'map(.+1)'

  2,
  3,
  4

Вы часто будете использовать его в сочетании с select, например

echo' 2,4,8 '| jq'map(select(. >= 3))'

  4,
  8

Собираем все вместе: практический пример jq

Поскольку jq обрабатывает любой правильный JSON, переданный ему по трубопроводу, вы можете отправить ему вывод из команды curl. Это позволяет получать JSON из URL и сразу же обрабатывать его в командной строке:

JSON Feed – это JSON-альтернатива форматам RSS и Atom. Сайт NPR является одним из примеров, поддерживающих JSON Feed, но его трудно просматривать из источника и он содержит много данных:

Сразу видно, насколько проще читать, если получить эти данные и передать их через jq:

$ curl -s https://feeds.npr.org/1019/feed.json | jq'.'

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

$ curl -s https://feeds.npr.org/1019/feed.json |
jq'.items |.   |
  select(
    date_published |
     0:19  +'Z'
    fromdate |
    strftime('%a') =='Tue'
  ) |
  {id:id, title:title, date:date_published}

После выбора свойства items этот фильтр использует . для перебора каждого элемента. Основная часть фильтра использует функцию select для сохранения только тех постов со значением date_published , чей день недели ( strftime(‘%a’) ) равен Tue. Функция strftime требует очень специфически отформатированной даты, которую фильтр . 0:19 + ‘Z’ конструирует

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


  'id''959667930'
  'title''Deplatforming: Not A First Amendment Issue, But Still A Tough Call For Big Tech'
  'date''2021-01-26T17:00:00-05:00'

  'id''960679189'
  'title''My Pillow CEO Mike Lindell Permanently Suspended From Twitter'
  'date''2021-01-26T10:17:15-05:00'

  'id''960220477'
  'title''Is Your 401(k) Colluding To Make Cereal More Expensive?'
  'date''2021-01-26T06:31:24-05:00'

См. также: Разбор JSON Python: Простое руководство

Как обрабатывать JSON онлайн с помощью jqplay

Если вы хотите опробовать jq, прежде чем скачать его, jqplay – идеальное место для начала. С помощью простого интерфейса сайт позволяет ввести образец JSON и фильтр, а затем просмотреть результат

Он также позволяет опробовать несколько различных опций. Среди них –compact-output (для удаления пробельных символов) и –null-input (для отображения результата при отсутствии входных данных)

Интерфейс также включает очень полезный раздел шпаргалок. Вот скриншот предыдущего длинного примера:

Обратите внимание, что, как и в случае с этой ссылкой, вы также можете поделиться примерами через URL

Использование jq для чтения и манипулирования данными JSON

Вы можете найти полную информацию о jq в учебнике и руководстве, которые находятся на сайте jq. Сама программа предлагает ограниченный объем справки через опцию –help

Если вам нужно выполнить базовые фильтры и преобразования или прочитать большой кусок JSON, jq – ценный инструмент

Теги

Об авторе

Алексей Белоусов

Привет, меня зовут Филипп. Я фрилансер энтузиаст . В свободное время занимаюсь переводом статей и пишу о потребительских технологиях для широкого круга изданий , не переставая питать большую страсть ко всему мобильному =)

Комментировать

Оставить комментарий