JSON配列をスペースで区切られた文字列に変換する

JSON配列をスペースで区切られた文字列に変換する

次のJSONファイルがあります。

{
 "name" : "Allow",
 "source" : [ "*" ,"0.0.0.0"]
}

JSONの文字列配列を「スペースで区切られた文字列」に変換できるように、このJSONを解析する必要があります。後で、この変数を次のような他の関数に提供する必要があります。

local file="file-name"
while read val; do
    local name
    local source

    name=$(jq --raw-output '.name' <<< ${val})
    source=$(jq --raw-output '.source' <<< ${val})
__test "${name}" "${source}" 
  done < <(cat ${file} | jq -rc '.[]')

したがって、デフォルトではソースを文字列に変更し、文字列リストの代わりに渡す必要があります。

ベストアンサー1

join(" ")通常、inを使用して配列要素をスペースで区切られた単一の文字列に変換できますjq。あなたの場合、.sourceその配列をスペースで区切られた文字列に変換するために使用できます.source | join(" ")

入力文書に、質問に表示されたタイプのオブジェクトの配列が含まれているとします。

jq繰り返すたびに複数回呼び出すのではなく、を使用してjqデータを単一のストリームとして使用できる形式に変換することを検討してください。

jq -r '.[] | [ .name, (.source | join(" ")) ] | @tsv' file.json |
while IFS=$'\t' read -r name source; do
    __test "$name" "$source"
done

これにより、ループにタブ区切りの2つのフィールドが表示されます。最初のフィールドは.nameJSON文書の値であり、2番目のフィールドは配列の要素を連結して形成されたスペースで区切られた文字列です.sourcejoin()配列要素を単一の文字列に連結し、配列をjq提供してタブ区切りの出力を生成するには、inを使用します。@tsv


勇気があれば使ってもいい

eval "$( jq -r '.[] | [ "__test", .name, (.source | join(" ")) ] | @sh' file.json )"

jqこれは、実行したいシェルコマンドを実際に生成するために使用されます。その後、シェルを呼び出してこれを取得します。スクリプト文字列に変換してevaljq式は、@shコマンド名とその引数への正しい参照を提供するために使用されます。ここの式には、jq質問に示されている型のオブジェクトの配列が必要です。

おすすめ記事