Введение

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

Появился FX — неинтерактивная, основанная на JavaScript альтернатива JQ, которая обещает стать переломным моментом. В этой статье блога вы окунетесь в мир FX и узнаете, как его можно использовать для упрощения задач обработки JSON.

Ключевые преимущества FX перед JQ

Вот некоторые задачи, которые FX может выполнить, но не может выполнить JQ:

  1. Поддержка больших целых чисел.

FX может работать с большими целыми числами благодаря поддержке BigInt в JavaScript. Эта функция отсутствует в JQ:

echo 12345678901234567890 | deno run https://fx.wtf
  1. Промисы.

FX может легко работать с обещаниями, обеспечивая асинхронную обработку данных. Это может быть особенно полезно при получении данных из URL:

echo ''https://medv.io/*'' | npx fx 'fetch' '.text()'
  1. Комментарии и запятые в JSON.

FX может обрабатывать данные JSON с комментариями и запятыми, чего не может делать JQ:

echo '[1,/* trailing comma */]'' | deno run https://fx.wtf
  1. Знакомый синтаксис 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 дает несколько преимуществ:

  1. Знакомство: FX использует синтаксис и функции JavaScript, что делает его простым в изучении и использовании для разработчиков, уже владеющих JavaScript.

  2. Гибкость: FX позволяет выполнять более сложные и гибкие манипуляции с данными благодаря возможностям JavaScript.

  3. Поддержка BigInt: FX поддерживает BigInt, что отсутствует в JQ.

  4. Комментарии и запятые в JSON: FX обрабатывает JSON с комментариями и запятыми, в отличие от JQ.

  5. Поддержка обещаний: FX легко работает с обещаниями, обеспечивая асинхронную обработку.

Заключение

FX — это мощная и гибкая альтернатива JQ, использующая возможности JavaScript для работы с JSON. Благодаря знакомому синтаксису, расширенным возможностям и простоте использования, FX может быстро стать вашим основным инструментом для обработки данных JSON. Попрощайтесь с постоянным поиском в Гугле синтаксиса JQ и борьбой с его ограничениями. Попробуйте FX и упростите свои задачи по обработке JSON уже сегодня!

Комментарии (8)


  1. xnike
    20.04.2023 13:42
    +3

    Почему стоит выбрать jq, а не fx: там всего один бинарь, он опакечен для дистрибутивов (rpm/brew/...) и может быть на хостах, где требуется его использование...


    1. Elfet Автор
      20.04.2023 13:42
      -6

      Почему стоит выбрать FX: вы JavaScript разработчик, работаете локально с api, не хотите гуглить и учить jq


    1. hello_my_name_is_dany
      20.04.2023 13:42

      fx - там всего один бинарь (даже есть pre-built), он опакечен (brew, snap, scoop, pacman, pkg)


    1. Elfet Автор
      20.04.2023 13:42
      -2

      Почему стоит выбрать FX: вы JavaScript разработчик, работаете локально с api, не хотите гуглить и учить jq


  1. Bigata
    20.04.2023 13:42

    Вне node.js работает? Поддержка в браузерах, в других серверных языках?


    1. hello_my_name_is_dany
      20.04.2023 13:42
      +1

      Вне node.js работает?

      Вообще эта тулза написана на Go

      Поддержка в браузерах, в других серверных языках?

      Это CLI программа, причём тут браузер и тем более какие-то ЯП?


    1. Elfet Автор
      20.04.2023 13:42
      -5

      Везде, нах


      1. Elfet Автор
        20.04.2023 13:42
        -2

        п****