将 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"
    }
  }
]

数据看起来并不完全像这样,而且我有超过三个元素。我想根据这些数据创建三个文件:x.jsony.jsonz.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,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.jsonz.json:

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

答案3

jq您创建一个 shell 脚本:

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

这将获取 JSON 文档中的每个顶级数组元素,并为每个元素创建一个 shell 此处文档重定向。每个重定向到cat都会被引用,以避免 shell 扩展文档中的内容。输出转到由值命名的文件,由中的格式化程序.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创建三个文件x.jsony.json、 并z.json使用三个嵌入并引用的此处文档来运行。

运行它只需将其sh -s直接从jq.

相关内容