Создать новую строку json из выходных элементов jq - PullRequest
0 голосов
/ 31 декабря 2018

Моя команда jq возвращает объекты в скобках, но без запятых.Но я хотел бы создать из него новую строку json.

Этот вызов находит все элементы arr, в которых есть FooItem, а затем возвращает texts из вложенного массива по индексу 3:

jq '.arr[] | select(index("FooItem")) | .[3].texts' 

на этом json (оригинал содержит больше элементов):

 {
      "arr": [
        [
          "create",
          "w199",
          "FooItem",
          {
            "index": 0,
            "texts": [
              "aBarfoo",
              "avalue"
            ]
          }
        ],
        [
          "create",
          "w200",
          "NoItem",
          {
            "index": 1,
            "val": 5,
            "hearts": 5
          }
        ],
        [
          "create",
          "w200",
          "FooItem",
          {
            "index": 1,
            "texts": [
              "mybarfoo",
              "bValue"
            ]
          }
        ]
    ]
    }

возвращает этот вывод:

[
  "aBarfoo",
  "avalue"
]
[
  "mybarfoo",
  "bValue"
]

Но я бы хотелсоздайте новый json из этих объектов, который выглядит следующим образом:

{
    "arr": [
        [
            "aBarfoo",
            "avalue"
        ],
        [
            "mybarfoo",
            "bValue"
        ]
    ]
}

Может ли jq сделать это?

EDIT

Еще одно дополнение: учитываячто в текстах также есть строки нулевой длины, как бы вы удалили эти строки или не получили их в результате?

"texts": ["",
          "mybarfoo",
          "bValue",
          ""
          ]

1 Ответ

0 голосов
/ 31 декабря 2018

Вы всегда можете встроить поток (ноль или более) сущностей JSON в некоторую другую структуру JSON, декорировав поток, то есть в данном случае, обернув STREAM следующим образом:

{ arr: [ STREAM ] }

В данном случае, однако, мы также можем принять мнение, что мы просто редактируем исходный документ, и, соответственно, используем вариант идиомы map(select(...)):

.arr |= map( select(index("FooItem")) | .[3].texts) 

Этот последний подход гарантирует, чтоконтекст клавиши «arr» сохраняется.

Приложение

Чтобы отфильтровать пустые строки, просто добавьте еще одну map(select(...)):

.arr |= map( select(index("FooItem"))
             | .[3].texts | map(select(length>0)))
...