You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用jq工具将复杂JSON数据转换为指定CSV格式?

解决使用jq将MongoDB导出JSON转为指定CSV的问题

问题背景

现有MongoDB导出的foo.json文件,需格式化为包含外层请求信息和内层债券列表的CSV,期望每行输出request.method、request.url及每个债券的详细字段。

正确的jq命令

jq -r '.request as $req | $req.body.bonds[] | [$req.method, $req.url, .bondDesc, .priorPriceBid, .priorPriceOffer, .priorYieldBid, .priorYieldOffer, .updatedPriceBid, .updatedPriceOffer, .updatedYieldBid, .updatedYieldOffer] | @csv' foo.json

命令逻辑说明

  1. 保存外层请求上下文:用.request as $req将外层request对象赋值给变量$req,后续遍历债券数组时可直接引用外层的method和url,避免重复解析。
  2. 遍历债券数组:$req.body.bonds[]会逐个输出数组中的每个债券对象,实现一行对应一个债券的输出效果。
  3. 组合目标字段:将外层的$req.method、$req.url与当前债券的字段合并为一个数组,确保每行CSV包含所有需要的字段。
  4. 转为CSV格式:@csv将数组转为符合规范的CSV字符串,-r参数输出原始字符串(不带JSON格式的外层引号)。

错误原因分析

你第三次尝试的命令报错,是因为:

jq -r ' [.request.method, .request.url], .request.body.bonds[] | [.bondDesc, ...] | @csv' foo.json

逗号会生成两个独立的输出流:第一个是[.request.method, .request.url]数组,第二个是bonds数组的每个元素。当管道到[.bondDesc, ...]时,第一个数组(仅包含method和url)没有bondDesc字段,因此触发"Cannot index array with string 'bondDesc'"错误。

验证结果

执行正确命令后,输出将与期望完全一致:

"UPDATED","Brocolli","bondDesc1",100,101,6.555,6.777,691,169,25.2345,25.9999
"UPDATED","Brocolli","bondDesc2",200,201,2.555,2.777,791,269,35.2345,35.9999

内容的提问来源于stack exchange,提问作者ImNoBody

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 04:25:25