Наличие 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
wivku 21 Ноя 2018 в 19:20

1 ответ

Лучший ответ

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

.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. Замените пустые массивы на null.

(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 следует изменить соответствующим образом.

0
peak 21 Ноя 2018 в 20:03