Введение
JSON стал де‑факто форматом обмена данными в современном мире. Он широко используется в различных приложениях, таких как API, конфигурационные файлы и хранилища данных. При работе с JSON нам часто требуется манипулировать, фильтровать или преобразовывать данные в соответствии с нашими требованиями. JQ — это популярный процессор JSON с командной строкой, который существует уже довольно давно. Однако у него есть свои ограничения — вы можете обнаружить, что постоянно гуглите его синтаксис, боретесь с отсутствием поддержки BigInt и имеете дело с отсутствующими функциями, такими как комментарии JSON и запятые.
Появился FX — неинтерактивная, основанная на JavaScript альтернатива JQ, которая обещает стать переломным моментом. В этой статье блога вы окунетесь в мир FX и узнаете, как его можно использовать для упрощения задач обработки JSON.
Ключевые преимущества FX перед JQ
Вот некоторые задачи, которые FX может выполнить, но не может выполнить JQ:
Поддержка больших целых чисел.
FX может работать с большими целыми числами благодаря поддержке BigInt в JavaScript. Эта функция отсутствует в JQ:
echo 12345678901234567890 | deno run https://fx.wtf
Промисы.
FX может легко работать с обещаниями, обеспечивая асинхронную обработку данных. Это может быть особенно полезно при получении данных из URL:
echo ''https://medv.io/*'' | npx fx 'fetch' '.text()'
Комментарии и запятые в JSON.
FX может обрабатывать данные JSON с комментариями и запятыми, чего не может делать JQ:
echo '[1,/* trailing comma */]'' | deno run https://fx.wtf
Знакомый синтаксис JavaScript.
FX использует знакомый синтаксис и функции JavaScript, что облегчает разработчикам работу с данными JSON без необходимости постоянно искать синтаксис, специфичный для JQ.
Что такое FX?
FX, сокращение от Function eXecution или f(x), — это мощный, неинтерактивный процессор JSON, который использует JavaScript для обеспечения более интуитивного и гибкого опыта работы с данными JSON. С FX вы можете использовать знакомый синтаксис JavaScript и функции для обработки JSON, что делает его более простым в освоении и использовании.
Начало работы с FX
Установить FX очень просто, достаточно выполнить следующую команду:
npm i -g fx
В качестве альтернативы можно использовать npx или даже запустить его с помощью Node или Deno:
cat file.json | npx fx .field
cat file.json | node <(curl -s https://fx.wtf) .field
cat file.json | deno run https://fx.wtf .field
Использование FX
FX рассматривает аргументы как функции JavaScript, передавая входные данные в первую функцию и затем передавая результаты в каждую следующую функцию. Например:
echo '{"name": "world"}'' | fx 'x => x.name' 'x => `Hello, ${x}!`'
Вы можете еще больше упростить синтаксис, используя ключевое слово this
:
echo '{"name": "world"}' | fx '.name' '``Здравствуйте, ${this}!``
И, конечно, вы можете использовать любую функцию JavaScript для обработки данных:
echo '{"name": "world"}'' | fx 'Object.keys'
Расширенное использование
FX может обрабатывать поток объектов JSON, применяя аргументы к каждому объекту:
echo '{"name": "hello"}\n{"name": "world"}' | fx '.name'
Чтобы обработать поток объектов JSON как единый массив, используйте флаг --slurp
или -s
:
echo '{"name": "hello"}\n{"name": "world"}' | fx --slurp '.map(x => x.name) ' '.join(", ")
Для не-JSON данных используйте флаг --raw
или -r
:
ls | fx -r '[this, this.includes(".md")]''
Комбинация флагов --raw
и --slurp
позволяет работать с массивом строк:
ls | fx -rs '.filter(x => x.includes(".md"))''
FX также поддерживает пропуск печати результатов с помощью символа skip
:
ls | fx -r '.includes(".md") ? this : skip'
Из коробки FX поставляется с такими полезными функциями, как uniq
, sort
и groupBy
:
cat file.json | fx 'uniq' 'sort' 'groupBy(x => x.name)'
FX также легко работает с обещаниями:
echo ''https://medv.io/*'' | fx 'fetch' '.text()'
Синтаксический сахар
FX предлагает сахар для таких распространенных функций, как map
:
curl https://api.github.com/repos/antonmedv/fx/commits | fx 'map(.commit.message)'
echo '[{"name": "world"}]'' | fx 'map(`Hello, ${x.name}!`)'
Он также предоставляет специальный синтаксис для функции flatMap
:
curl https://api.github.com/repos/kubernetes/kubernetes/issues | fx '.[].labels[].name'
Почему стоит выбрать FX, а не JQ?
Хотя JQ был основным выбором для обработки JSON, FX дает несколько преимуществ:
Знакомство: FX использует синтаксис и функции JavaScript, что делает его простым в изучении и использовании для разработчиков, уже владеющих JavaScript.
Гибкость: FX позволяет выполнять более сложные и гибкие манипуляции с данными благодаря возможностям JavaScript.
Поддержка BigInt: FX поддерживает BigInt, что отсутствует в JQ.
Комментарии и запятые в JSON: FX обрабатывает JSON с комментариями и запятыми, в отличие от JQ.
Поддержка обещаний: FX легко работает с обещаниями, обеспечивая асинхронную обработку.
Заключение
FX — это мощная и гибкая альтернатива JQ, использующая возможности JavaScript для работы с JSON. Благодаря знакомому синтаксису, расширенным возможностям и простоте использования, FX может быстро стать вашим основным инструментом для обработки данных JSON. Попрощайтесь с постоянным поиском в Гугле синтаксиса JQ и борьбой с его ограничениями. Попробуйте FX и упростите свои задачи по обработке JSON уже сегодня!
Комментарии (8)
Bigata
20.04.2023 13:42Вне node.js работает? Поддержка в браузерах, в других серверных языках?
hello_my_name_is_dany
20.04.2023 13:42+1Вне node.js работает?
Вообще эта тулза написана на Go
Поддержка в браузерах, в других серверных языках?
Это CLI программа, причём тут браузер и тем более какие-то ЯП?
xnike
Почему стоит выбрать jq, а не fx: там всего один бинарь, он опакечен для дистрибутивов (rpm/brew/...) и может быть на хостах, где требуется его использование...
Elfet Автор
Почему стоит выбрать FX: вы JavaScript разработчик, работаете локально с api, не хотите гуглить и учить jq
hello_my_name_is_dany
fx - там всего один бинарь (даже есть pre-built), он опакечен (brew, snap, scoop, pacman, pkg)
Elfet Автор
Почему стоит выбрать FX: вы JavaScript разработчик, работаете локально с api, не хотите гуглить и учить jq