使用JQ解析嵌套哈希,获取指定关联格式输出的问题
解决JQ解析JSON时产生笛卡尔积的问题
嘿,我懂你碰到的麻烦了——你现在得到的是所有字段的交叉组合(笛卡尔积),这是因为你的JQ表达式没把外层的name和data数组里的对应元素正确关联起来。咱们一步步来修正这个问题!
首先,先确认你的原始JSON结构:
{ "name": "a", "data": [ { "sensitive": false, "type": "string", "value": "mykeypair" }, { "sensitive": false, "type": "int", "value": 123 } ] }
正确的JQ命令
你需要确保遍历data数组的每一项时,都能拿到外层的name,然后把三者拼接成指定格式,最后用空格连接所有结果。这里有两种简洁的写法:
写法一:先保存外层对象,再遍历数组
. as $root | .data[] | "\($root.name),\(.type),\(.value)" | join(" ")
写法二:先收集结果到数组,再拼接
. as $obj | [.data[] | "\($obj.name),\(.type),\(.value)"] | join(" ")
命令解释
. as $root:把整个JSON对象保存到变量$root中,这样在遍历data数组的每个元素时,依然能访问到外层的name字段。.data[]:遍历data数组里的每一个子对象。"\($root.name),\(.type),\(.value)":将外层的name、当前子对象的type和value拼接成你需要的字符串格式。join(" "):把所有拼接好的字符串用空格连接起来,得到最终的输出。
执行结果
运行上面的命令后,你会得到期望的输出:
a,string,mykeypair a,int,123
为什么之前会出错?
如果你的原始表达式类似.name, .data[] | .type, .value这种,JQ会把name和data数组里的每个type、value进行交叉组合,也就是所谓的笛卡尔积,最终就会生成你看到的4个结果。关键就是要把name和data数组的每一项绑定在一起处理,避免交叉遍历。
内容的提问来源于stack exchange,提问作者Akash Khandelwal
相关产品推荐
相关产品推荐

