Создайте составной объект из сложного объекта json с помощью jq - PullRequest
1 голос
/ 02 августа 2020

У меня есть сложный файл конфигурации в JSON:

{
    "config": {
        ...,
        "extra": {
            ...
            "auth_namespace.com": {
                ...
                "name": "some_name",
                "id": 1,
                ...
            }
        },
        ...,
        "endpoints": [
            {   ...,
                "extra": {
                    "namespace_1.com": {...},
                    "namespace_auth.com": { "scope": "scope1" }
            }},
            {   ...
                # object without "extra" property
                ...
            },
            ...,
            {   ...
                "extra": {
                    "namespace_1.com": {...},
                    "namespace_auth.com": { "scope": "scope2" }
            }},
            {   ...
                "extra": {
                    # scopes may repeat
                    "namespace_auth.com": { "scope": "scope2" }
            }}
        ]
    }
}

И я хочу получить выходной объект со свойствами "name" , "id" , «объемы» . Где «области» - это массив уникальных значений. Примерно так:

{
    "name": "some_name",
    "id": 1,
    "scopes": ["scope1", "scope2" ... "scopeN"]
}

Эти свойства я могу получить отдельно. Но я не знаю, как их объединить.

[
    .config |
    (
        .extra["auth_namespace.com"] |
        select(.name) |
        {name, id}
    ) as $name_id |

    .endpoints[] |
    .extra["namespace_auth.com"].scope |
    select(.)
] | unique | {scopes: .}

Ответы [ 2 ]

2 голосов
/ 02 августа 2020

Возможно, следующее ближе к тому, что вы ищете:

.config
| (.extra."auth_namespace.com" | {id, name}) 
  + {scopes: .endpoints
             | map( select(has("extra"))
                    | .extra."namespace_auth.com"
                    | select(has("scope"))
                    | .scope )
             | unique }
0 голосов
/ 02 августа 2020

Что ж, я нашел решение. Это некрасиво, но работает. Был бы признателен, если бы кто-нибудь мог написать более элегантную версию.

.config
| (
  .endpoints
  | map(.extra["namespace_auth.com"] | select(.scope) | .[])
  | unique
) as $s
| .extra["auth_namespace.com"] | select(.name)
| {name, id, scopes: $s}
...