JSON配列を複数のファイルに分割する

JSON配列を複数のファイルに分割する

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

[
  {
    "billingAccountNumber": "x",
    "paymentResponseObject": {
      "uiErrorDipslayMessage": "",
      "transactionStatus": "S",
      "transactionDescription": "",
      "transactionCode": "",
      "confirmationNumber": "1"
    }
  },
  {
    "billingAccountNumber": "y",
    "paymentResponseObject": {
      "uiErrorDipslayMessage": "",
      "transactionStatus": "S",
      "transactionDescription": "",
      "transactionCode": "",
      "confirmationNumber": "2"
    }
  },
  {
    "billingAccountNumber": "z",
    "paymentResponseObject": {
      "uiErrorDipslayMessage": "",
      "transactionStatus": "S",
      "transactionDescription": "",
      "transactionCode": "",
      "confirmationNumber": "3"
    }
  }
]

データがまったくそうではなく、3つ以上の要素があります。このデータに基づいてx.json、、、y.jsonおよび3つのファイルを生成したいと思いますz.json。各ファイルの内容をpaymentResponseObject

これを行う方法はありますかjq?でこれを行う方法を見つけましたが、awkこれは非常に不機嫌で、他のモードを使用してこのプロセスを繰り返すことができることを願っています。awk各モードでスクリプトの80%を書き直す必要がありました。

答え1

~からこれしたがって、スレッドは次のようになります。

jq -cr 'keys[] as $k | "\($k)\n\(.[$k])"' input.json | while read -r key; do
  fname=$(jq --raw-output ".[$key].billingAccountNumber" input.json)
  read -r item
  printf '%s\n' "$item" > "./$fname"
done

答え2

0.jsonこのコードを使用して、各要素をnameと1.jsonとして保存してみてください2.json。ちなみに、配列内のJSONエントリの数に関係なく機能します。

for i in $(seq $(jq '.|length' sample.json)); do \
    j=$( expr $i - 1 ); \
    jq ".[$j]" sample.json > $j.json;  \
done

説明する:

次の行は、オブジェクト名を指定する配列の長さを探します。

$(seq $(jq '.|length' sample.json))

配列は0から始まるので、出力ファイル名を変更します。

j=$( expr $i - 1 );

次の行は、jsonドキュメントから要素を取得し、ファイルに保存します。

jq ".[$j]" sample.json > $j.json;

x.json文字通り、y.jsonおよびz.json:に保存します。

for i in x y z; do \
  jq ".[$count]" sample.json > $i.json;  \
  count=$( expr $count + 1 ) \
done

答え3

次のjqシェルスクリプトを作成します。

jq -r '.[] |
    @sh "cat >\(.billingAccountNumber).json <<\\END",
    .paymentResponseObject,
    "END"' file.json

これにより、JSONドキュメントの各トップレベルの配列要素が取得され、各要素の励起ドキュメントリダイレクトシェルが作成されます。catシェルがドキュメントの内容を拡張するのを防ぐために、各リダイレクトが引用されます。出力は、.billingAccountNumberのフォーマッタが参照する値で指定されたファイルに移動されます。@shjq

質問のデータが与えられると、スクリプトが生成されます。

cat >'x'.json <<\END
{
  "uiErrorDipslayMessage": "",
  "transactionStatus": "S",
  "transactionDescription": "",
  "transactionCode": "",
  "confirmationNumber": "1"
}
END
cat >'y'.json <<\END
{
  "uiErrorDipslayMessage": "",
  "transactionStatus": "S",
  "transactionDescription": "",
  "transactionCode": "",
  "confirmationNumber": "2"
}
END
cat >'z'.json <<\END
{
  "uiErrorDipslayMessage": "",
  "transactionStatus": "S",
  "transactionDescription": "",
  "transactionCode": "",
  "confirmationNumber": "3"
}
END

shこれは、3つのファイルx.jsony.jsonおよびz.jsonここに含まれて参照されている3つの文書を使用して実行できます。

実行するにsh -sはから直接引っ張りますjq

関連情報