使用 JQ 将复杂 JSON(具有数组和不同数据类型)转换为 CSV?
Convert complex JSON (with arrays and different data types) to CSV using JQ?
我有以下 JSON 数据:
{
"status": "ok",
"ok": true,
"data": "MFR-L",
"stores": [{
"name": "KOLL",
"lat": 52.93128,
"lng": 6.962956,
"dist": 1,
"x10": 1.129,
"isOpen": true
},
{
"name": "Takst",
"lat": 52.9523773,
"lng": 6.981644,
"dist": 1.3,
"x10": 1.809,
"isOpen": false
}]
}
我正在尝试使用 JQ 将其转换为平面文件,但我一直 运行 遇到各种问题,尤其是因为文件类型("cannot index boolean with string" 等)。
到目前为止, 帮助我展平了数组的内容,如下所示:
jq -r -s 'map(.stores | map({nm: .name, lt: .lat} | [.nm, .lt])) | add [] | @csv
如何让层次结构中更高层的内容映射到数组内容?
您始终可以分别从父对象和子对象中收集您想要的值,然后再将它们组合起来。
例如,
$ jq -r '[.data] + (.stores[] | [.name, .lat, .lng, .dist]) | @csv' input.json
产量
"MFR-L","KOLL",52.93128,6.962956,1
"MFR-L","Takst",52.9523773,6.981644,1.3
说明性 JSON 可能有多种方式 "flattened"(例如 CSV),但以下两种方法可能会引起您的兴趣。 (为了便于阅读,我省略了 @csv 的调用。)
$ jq '[.data, .stores[][]]' in.json
[
"MFR-L",
"KOLL",
52.93128,
6.962956,
1,
1.129,
true,
"Takst",
52.9523773,
6.981644,
1.3,
1.809,
false
]
$ jq '.data as $data | .stores[] | [$data, .[]]' in.json
[
"MFR-L",
"KOLL",
52.93128,
6.962956,
1,
1.129,
true
]
[
"MFR-L",
"Takst",
52.9523773,
6.981644,
1.3,
1.809,
false
]
这是另一种使用 jq 变量和字符串插值的方法:
.data as $data
| .stores[]
| "\($data),\(.name),\(.lat),\(.lng),\(.dist),\(.x10),\(.isOpen)"
输出示例数据:
"MFR-L,KOLL,52.93128,6.962956,1,1.129,true"
"MFR-L,Takst,52.9523773,6.981644,1.3,1.809,false"
我有以下 JSON 数据:
{
"status": "ok",
"ok": true,
"data": "MFR-L",
"stores": [{
"name": "KOLL",
"lat": 52.93128,
"lng": 6.962956,
"dist": 1,
"x10": 1.129,
"isOpen": true
},
{
"name": "Takst",
"lat": 52.9523773,
"lng": 6.981644,
"dist": 1.3,
"x10": 1.809,
"isOpen": false
}]
}
我正在尝试使用 JQ 将其转换为平面文件,但我一直 运行 遇到各种问题,尤其是因为文件类型("cannot index boolean with string" 等)。
到目前为止,jq -r -s 'map(.stores | map({nm: .name, lt: .lat} | [.nm, .lt])) | add [] | @csv
如何让层次结构中更高层的内容映射到数组内容?
您始终可以分别从父对象和子对象中收集您想要的值,然后再将它们组合起来。
例如,
$ jq -r '[.data] + (.stores[] | [.name, .lat, .lng, .dist]) | @csv' input.json
产量
"MFR-L","KOLL",52.93128,6.962956,1
"MFR-L","Takst",52.9523773,6.981644,1.3
说明性 JSON 可能有多种方式 "flattened"(例如 CSV),但以下两种方法可能会引起您的兴趣。 (为了便于阅读,我省略了 @csv 的调用。)
$ jq '[.data, .stores[][]]' in.json
[
"MFR-L",
"KOLL",
52.93128,
6.962956,
1,
1.129,
true,
"Takst",
52.9523773,
6.981644,
1.3,
1.809,
false
]
$ jq '.data as $data | .stores[] | [$data, .[]]' in.json
[
"MFR-L",
"KOLL",
52.93128,
6.962956,
1,
1.129,
true
]
[
"MFR-L",
"Takst",
52.9523773,
6.981644,
1.3,
1.809,
false
]
这是另一种使用 jq 变量和字符串插值的方法:
.data as $data
| .stores[]
| "\($data),\(.name),\(.lat),\(.lng),\(.dist),\(.x10),\(.isOpen)"
输出示例数据:
"MFR-L,KOLL,52.93128,6.962956,1,1.129,true"
"MFR-L,Takst,52.9523773,6.981644,1.3,1.809,false"