jqでjsonを構築する

jqでjsonを構築する

次のようにjqからjsonファイルを生成したいと思います。

{
  "cpe": "dabb8fbd-d7be-4175-abb4-c628bb8cf1b5",
  "ps": [ "Obev" ],
  "ets": 5,
  "pMap": {
      "aik": ["1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-1", "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-2", "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-3", "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-4", "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-5"]
    }

これは私がjqで試したことです -

inner2=$(jq -n --arg aik "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-1", "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-2", "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-3", "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-4", "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-5" \
              '$ARGS.named')

res=$(jq -n   --arg cpe "App" \
              --arg ps "["Obev"]" \
              --arg ets 5 \
              --argjson pMap "$inner2" \
              '$ARGS.named')

ただし、予想どおりJSON形式を返しません。 ets値が5intの場合、引用符は必要ありませんが、 pMap次のように値が生成されます。"aik": {"1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-1, 1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-2, 1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-3, 1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-4, 1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-5"}

必要な操作によっては、ここではフォーマットは生成されません。

ps必要な操作によっては値も生成されません。

どんな助けでもいいでしょう。

ベストアンサー1

使用jo(参照ここ)を使用すると、コマンドラインからJSONを作成するよりも、コマンドラインからJSONを作成する方が簡単ですjq。を使用して配列を作成できますjo -a

jo -p \
        cpe='dabb8fbd-d7be-4175-abb4-c628bb8cf1b5' \
        ps="$( jo -a Obev )" \
        ets=5 \
        pmap="$( jo aik="$( jo -a \
                "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-1" \
                "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-2" \
                "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-3" \
                "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-4" \
                "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-5" )" )"

配列のあるシェルを使用すると仮定すると、配列etsの長さは次のとおりですaik

data=(
        "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-1"
        "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-2"
        "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-3"
        "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-4"
        "1~4-b7-4c-bb-b~od1.y.1..aiq~s-an-6~-a-5"
)

jo -p \
        cpe='dabb8fbd-d7be-4175-abb4-c628bb8cf1b5' \
        ps="$( jo -a Obev )" \
        ets="${#data[@]}" \
        pmap="$( jo aik="$( jo -a "${data[@]}" )" )"

-pmake sat Pretty オプションはjo出力を印刷するので、ドキュメントが正しく設定されていると満足している場合は削除してください。


jq配列が存在すると仮定すると、そのコマンドdataは次のようになります。

jq -n \
        --arg cpe 'dabb8fbd-d7be-4175-abb4-c628bb8cf1b5' \
        --argjson ps "$( jq -n '$ARGS.positional' --args Obev )" \
        --arg ets "${#data[@]}" \
        --argjson pmap "$(
                jq -n --argjson aik "$( jq -n '$ARGS.positional' --args "${data[@]}" )" \
                        '$ARGS.named'
        )" \
        '$ARGS.named'

つまり、

jq -n '$ARGS.positional' --args some arguments here

匿名配列を作成します。

おすすめ記事