シェルスクリプトからJSONを生成する

シェルスクリプトからJSONを生成する

次のようにJSON出力を生成する必要があります。

[{
    "Service": "service1-name",
    "AWS Account": "service1-dev",
    "AD Accounts": {
        "APP-Service1-Admin": ["a", "b"],
        "APP-Service1-View": ["c", "d"]
    }
}
]

このシェルスクリプトを試していますが、内部情報を挿入できません

#!/bin/bash
innerAD=$(jq -n --arg aaaa aaaa \
              --arg xxxx "xxxx" \
              '$ARGS.named'
)
inner=$(jq -n --argjson "APP-Service1-Admin" "[$innerAD]" \
              '$ARGS.named'
)
final=$(jq -n --arg Service "service1-name" \
              --arg "AWS Account" "service1-dev" \
              --argjson "AD Accounts" "[$inner]" \
              '$ARGS.named'
)
echo "$final"

ベストアンサー1

--args1つの提案は、withを使用してjq2つの配列を作成し、基本文書の正しい場所に収集することです。これは--argsコマンドラインの最後のオプションでなければなりません。みんな残りのコマンドラインパラメータは$ARGS.positional配列の要素になります。

{
    jq -n --arg key APP-Service1-Admin '{($key): $ARGS.positional}' --args a b
    jq -n --arg key APP-Service1-View  '{($key): $ARGS.positional}' --args c d
} |
jq -s --arg key 'AD Accounts' '{($key): add}' |
jq --arg Service service1-name --arg 'AWS account' service1-dev '$ARGS.named + .'

最初の 2 つjqの呼び出しは、2 つの JSON オブジェクトのセットを作成します。

{
  "APP-Service1-Admin": [
    "a",
    "b"
  ]
}
{
  "APP-Service1-View": [
    "c",
    "d"
  ]
}

3番目の呼び出しはコレクションを配列に読み込むjqために使用され、この配列は渡されたときにマージされたオブジェクトになります。マージされたオブジェクトは最上位キーに割り当てられます。-sadd

{
  "AD Accounts": {
    "APP-Service1-Admin": [
      "a",
      "b"
    ],
    "APP-Service1-View": [
      "c",
      "d"
    ]
  }
}

最後に、jq残りの最上位キーとその値をオブジェクトに追加します。

{
  "Service": "service1-name",
  "AWS account": "service1-dev",
  "AD Accounts": {
    "APP-Service1-Admin": [
      "a",
      "b"
    ],
    "APP-Service1-View": [
      "c",
      "d"
    ]
  }
}

そしてjo

jo -d . \
    Service=service1-name \
    'AWS account'=service1-dev  \
    'AD Accounts.APP-Service1-Admin'="$(jo -a a b)" \
    'AD Accounts.APP-Service1-View'="$(jo -a c d)"

「内部」オブジェクトは、.-notation(有効にする-d .)と配列を生成するための複数のコマンド置換を使用して生成されます。

あるいは、-d .配列表記形式を削除して使用することもできます。

jo  Service=service1-name \
    'AWS account'=service1-dev \
    'AD Account[APP-Service1-Admin]'="$(jo -a a b)" \
    'AD Account[APP-Service1-View]'="$(jo -a c d)"

おすすめ記事