JQ ~ Есть ли лучший способ свернуть массивы отдельных объектов? - PullRequest
0 голосов
/ 03 июля 2018

Вопрос: Это лучший способ сделать это?

Инструмент:

jq --version jq-1.5-1-a5b5cbe

Требование: Чтобы рекурсивно идентифицировать массивы [], содержащие только один объект {}, и преобразовать массив обратно в стандартный объект {}. По сути, чтобы удалить родительский массив, когда он не нужен.

Что, кажется, работает:

(..|select(type=="array" and .[1] == null ) | . ) |= add | .

Вариант использования: Пользовательский поиск Google JSON содержит множество массивов, многие из которых являются массивами с одним объектом. Фильтр Logstash input, codec => json и / или json, по-видимому, не способен автоматически превращать массивы отдельных объектов в поля эластичного поиска.

1 Ответ

0 голосов
/ 03 июля 2018

Самый простой подход - использовать walk/1, который, однако, был введен только после выпуска jq 1.5. Следовательно, следующее включает его определение:

# Apply f to composite entities recursively, and to atoms
def walk(f): 
  . as $in
  | if type == "object" then
      reduce keys[] as $key
        ( {}; . + { ($key):  ($in[$key] | walk(f)) } ) | f
  elif type == "array" then map( walk(f) ) | f
  else f
  end;

walk(if type=="array" and length==1 and (.[0]|type) == "object" then .[0] else . end)

Конечно, возможно много вариантов, например, в соответствии с вашей программой:

walk(if type=="array" and length==1 then .[0] else . end)
...