amarao (amarao_san) wrote,
amarao
amarao_san

iteration over json

Предварительные мысли.


Очевидно, что в комбинации array, содержащий object, содержащий array и так долго-долго, мы:

1) Должны точно контролировать глубину рекурсии. Если итерация идёт по первому array, то элементы object'а можно указывать в командной строке по имени.

Примерно вот так: cat json | json-iterate /usr/bin/command ${.filename} ${.filesize}

(синтаксис языка - под вопросом).

2) Что делать, если этот object в соответствующем key содержит array? Решение №1 - разворачивать весь array до победного конца.

То есть если в примере выше ${.filesize} это, вдруг, [1,2,3,4,5,6,7...], то вызовем мы команду в виде /usr/bin/command foo.txt 1 2 3 4 5 6 7, а для следующего элемента из array верхнего уровня будет вызвана следующая команда.

Второй вариант - реджектить (останавливаться)

Третий - пропускать.

Четвёртый - брать только первый элемент. Надо ли при этом разрешать ${.filesize[3])?

А что, если этот массив содержит композитные элементы? (опять же объекты?)

Из всего этого напрашивается jpath (аналогично xpath) с явным указанием глубины рекурсии по спискам, при этом по-умолчанию глубина 1 (то есть обрабатывается только топ-левел список).

Таким образом, до уровня глубины рекурсии объекты итерируются, ниже - по ним можно шариться jpath'ом. Если объект неправильно указан (например, подразумевается, что ждут простое значение, а оно композитное) - в зависимости от настроек, либо ошибку, либо пропускать (то есть не запускать команду), либо передавать объект "как есть", то есть в виде json-сниппета.

Я плохо знаю xpath/jpath, видимо, надо садиться и учить. Надеюсь там есть готовое, но если нет, то надо будет предусмотреть возможность взятия нескольких элементов.

Например, если у нас есть объект в одном из значений которого указан массив, то надо дать возможность сказать "все элементы массива", или "N элементов массива". (И тут же просится возможность итерировать по этому вложенному массиву).

Получается довольно громоздко. Хотя кому такие случаи нужны?

Пример для такой итерации:

[
{"foo":[1,2,3,4,5,6], "bar":True},
{"foo":[1], "bar":False}
]
Tags: json4shell, программирование
Subscribe

  • рисование? Профит!

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

  • рисовальное

    Ну как-то так. В пропорции попадаю только осмысленно (перемерив), хотя иногда глазомер кое-как попадает. Тон я трогаю, но без глубокого энтузиазма,…

  • Цилиндрическое (финал 1)

    Ещё предстоит цилиндр в нестандартном ракурсе, но в целом, я первый раз уверен в рисунке цилиндра. Направляющие и "насквозь" оставлено…

  • 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.
  • 7 comments