Свести массив для свойств во вложенном массиве объектов JSON, используя jq - PullRequest
0 голосов
/ 21 ноября 2018

Наличие JSON с (упрощенными) данными Jira, такими как:

{
    "issues": [
        {
            "key": "TEST-A",
            "fields": { "issuelinks": [] }
        },
        {
            "key": "TEST-B",
            "fields": {
                "issuelinks": [
                    { "inwardIssue": { "key": "TEST-1" } },
                    { "outwardIssue": { "key": "TEST-2" } },
                    { "outwardIssue": { "key": "TEST-3" } }
                ]
            }
        }
    ]
}

Хотелось бы получить вывод как:

[
    { "key": "TEST-A", "inward": null, "outward": null },
    { "key": "TEST-B", "inward": ["TEST-1"], "outward": ["TEST-2", "TEST-3"] }
]

Пробовал (игнорируя внутренние ссылки на данный момент):

cat data.json | \
jq '.issues[] | {"key":.key, "outward":.fields.issuelinks[].outwardIssue.key }'

Но я получаю:

{ "key": "TEST-B", "outward": "TEST-1" }
{ "key": "TEST-B", "outward": "TEST-2" }
{ "key": "TEST-B", "outward": null }

Примечание: ожидал бы 1) TEST-A для последнего, 2) TEST-2 и TEST-3 для первых двух и хотел бы3) объединить в массив TEST-2 и TEST-3.

Предложения?

1 Ответ

0 голосов
/ 21 ноября 2018

Давайте начнем с варианта вашей первой попытки:

.issues[]
 | {key,
   inward: .fields.issuelinks|map(.inwardIssue.key // empty),
   outward: .fields.issuelinks|map(.outwardIssue.key // empty) }

На вашем примере это дает:

{"key":"TEST-A","inward":[],"outward":[]}
{"key":"TEST-B","inward":["TEST-1"],"outward":["TEST-2","TEST-3"]}

Таким образом, для достижения поставленной цели необходимы два ремонта:

  1. Создать массив (например, заключив вышеприведенное выражение в квадратные скобки)
  2. Заменить пустые массивы на ноль.

(2) сомнительноно это легко сделать, например, используя вспомогательную функцию, определенную ниже.

Решение

def extract(f): map(f // empty) | if length ==0 then null else . end;

.issues
| map(
   {key,
    inward: .fields.issuelinks|extract(.inwardIssue.key),
    outward: .fields.issuelinks|extract(.outwardIssue.key)})

Предостережение

Если extract должен сохранить значения null и false, тогда его def должен быть соответственно изменен.

...