amarao (amarao_san) wrote,
amarao
amarao_san

Category:

странная идея - json pipe processing

(По результатам сегодняшнего срача вокруг эластика на работе, конструктивная часть).

Среди всего, что было у MS сделано в powershell, была одна хорошая идея - это передача объектов через pipe.

Я как-то мельком слышал про попытку xml'изации pipe'а. Которая была обречена на проклятия за одно упоминание xml.

Но, теоретическая проблема структурирования объектов, передаваемых в pipe, остаётся.

Вопрос №1: были ли попытки тут сделать что-то подобное?

Если нет, вот набор идей:

Все утилиты, кроме входных и выходных, работают с валидным json'ом. Если такой утилите попадается невалидный json, она:
а) пропускает как есть
б) молча съедает всё, что не json
в) останавливается

Поведение, видимо, контролируется ключами командной строки и/или переменными среды окружения.

Каждая утилита решает одну конкретную проблему.

Например:

json-array-head - возвращает первый элемент из json'а, который список (в top-level). Ключи и поведение аналогичное head. Аналогичный же json-array-tail, json-array-sort, json-array-uniq, json-array-shuffle, json-array-count и т.д. json-array-join принимает на вход два массива, выдаёт один, объединённый. Например, так:

(print-json1;print-json2)|json-array-join|json-array-sort|json-array-uniq|json-array-shuffle|json-print

json-obj-any возвращает любой элемент, json-obj-get возвращает элемент по ключу, json-obj-join объединяет два объекта, json-obj-append добавляет элемент к json'у (то есть первый json, второй объект, json-obj-prepend наоборот) и т.д.

Ключевым являются входные и выходные эндпоинты.

Допустим, простейшее: lines2json - принимает список строк, делает из них array. syslog2json приводит syslog вывод в json, keyval2json превращает вывод key value в json, при этом разделитель даётся в командной строке, а по умолчанию - что-то вменяемое (например, любая комбинация из символов пробела, таба, двоеточия, пайпа, запятой или точки с запятой). Таких фильтров можно придумать много.

Выходные эндпоинты аналогичны:

jsonpipe уже написан (http://thechangelog.com/jsonpipe-convert-json-to-a-unix-friendly-line-based-form/)
json2js выводит в виде операторов присвоения явы
json2env выводит в виде готовых к env'у выражений
и т.д.

Я подожду комментариев, если не будет, попытаюсь что-то своё налабать.

Да, и нужно думать про имя. Имена в примере выше слишком длинные. Я бы предпочёл иметь к ним короткие алиасы вида jog (json-object-get), jah (json array head), etc. Варианты: shson, jsh, jash, jajo, json4shell.

Ах, да, главное, чуть не забыл. ФЯП, разумеется.

json-array-map - работает аналогично xarg'у, принимает на вход array из json'а, вызывает указанную программу для каждого эелмента array, результат заворачивает в array.

json-array-filter - аналогично, но пропускает элементы только в зависимости от результатов выполнения указанной программы.

и т.д.
Tags: json
Subscribe

  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 15 comments