如何遍历 .json 并获取 .csv?

How to iterate through .json and get .csv?

我有以下json内容:

{
"iccid": "1961021111937667",
"timeStamp": "2021-03-25T09:42:30.681Z",
"cycleStartDate": "2021-02-28T16:00:00.000Z",
"cycleEndDate": "2021-03-31T14:59:59.000Z",
"deviceCycleUsageInZones": {
"TEST-25GB, 1": [
{
"ratePlan": "TEST-25GB",
"ratePlanVersion": "1",
"zone": "default zone",
"dataUsage": 15155147646,
"dataUsageUnit": "bytes",
"voiceMTUsage": null,
"voiceMTUsageUnit": null,
"voiceMOUsage": null,
"voiceMOUsageUnit": null,
"smsmtusage": null,
"smsmousage": 3
}
],
"TEST-29GB, 1": [
{
"ratePlan": "TEST - 29602",
"ratePlanVersion": "1",
"zone": "default zone",
"dataUsage": null,
"dataUsageUnit": null,
"voiceMTUsage": 1080,
"voiceMTUsageUnit": "seconds",
"voiceMOUsage": 960,
"voiceMOUsageUnit": "seconds",
"smsmtusage": null,
"smsmousage": null
}
]
}
}

如何通过 .json 文件的内容来获得以下 .csv 输出?

1961021111937667, 2021-03-25T09:42:30.681Z,15155147646,bytes,null,null,null,null,null,3
1961021111937667, 2021-03-25T09:42:30.681Z,null,null,1080,seconds,960,seconds,null,null

换句话说,我想要包含以下 headers:

iccid,timeStamp,dataUsage,dataUsageUnit,voiceMTUsage,voiceMTUsageUnit,voiceMOUsage,voiceMOUsageUnit,smsmtusage,smsmousage

假设输入的结构如图所示,根据问题中的 header,以下内容保证生成有效的 CSV(包括 header):

["iccid","timeStamp"] as $h1
| ["dataUsage","dataUsageUnit","voiceMTUsage","voiceMTUsageUnit","voiceMOUsage","voiceMOUsageUnit","smsmtusage","smsmousage"] as $h2
| ($h1+$h2),
  ([.[$h1[]]] + (.deviceCycleUsageInZones[][] | [.[$h2[]]] ))
| @csv

如果你真的不希望字符串被引用,那么将 @csv 更改为 join(","),并希望最好。

讨论

上述解决方案不依赖于 JSON objects 中键的顺序。这是使用成语实现的:

.[ $index[] ]

其中 $index 是键名数组。这种小聪明是可能的,因为给定一个 jq 表达式 s,生成一个 JSON 值流 s1,s2,...,jq 表达式 $x[s] 的计算结果为流:$x[ s1], $x[s2], ..., 假设后面所有的 jq 表达式都是有效的。