如何用JQ从JSON数组中筛选出唯一的JSON对象
问题分析
你的jq命令之所以输出重复数组,核心原因是getPreVal($input)会遍历sc数组的每个fix字段(输出"Hello"和"Hello2"两个结果),而jq管道会对每个输入执行后续命令,导致getWhereVal($input)被触发两次,进而重复输出整个sc数组。unique函数在这里无效,因为原数组内的对象本身就是唯一的。
解决方案
情况1:仅获取sc数组的对象集合(无重复输出)
直接移除多余的getPreVal相关逻辑,使用最简命令:
.sc[]
执行后输出(每个对象单独一行,符合JSON流格式):
{"pn": "di","pv": {"val": "26","com": "="},"fix": "Hello","tp": "String"} {"pn": "di2","pv": {"val": "28","com": "="},"fix": "Hello2","tp": "String"}
如果需要你预期的逗号分隔格式(非标准JSON,但匹配需求),可使用:
.sc | map(tostring) | join(",")
输出:
{"pn":"di","pv":{"val":"26","com":"="},"fix":"Hello","tp":"String"},{"pn":"di2","pv":{"val":"28","com":"="},"fix":"Hello2","tp":"String"}
情况2:需同时关联fix字段与对应对象
如果需要保留fix和对象的关联关系,可调整命令:
.sc[] | {fix, obj: .}
输出:
{"fix":"Hello","obj":{"pn":"di","pv":{"val":"26","com":"="},"fix":"Hello","tp":"String"}} {"fix":"Hello2","obj":{"pn":"di2","pv":{"val":"28","com":"="},"fix":"Hello2","tp":"String"}}
原命令错误点拆解
getPreVal(input): input.sc[].fix:该函数会遍历sc数组的每个元素,输出每个元素的fix值,产生多个输入流。. as $input | getPreVal($input) as $preVal | getWhereVal($input):getPreVal($input)输出两个值,每个值都会触发后续的getWhereVal($input),导致getWhereVal被执行两次,最终重复输出数组。
内容的提问来源于stack exchange,提问作者Pkulkarni
相关产品推荐
相关产品推荐

