使用yq从JSON生成id与values组合字符串的异常问题
用yq实现id与对应values数组元素的拼接(避免笛卡尔积)
问题背景
给定类似如下结构的JSON(实际存在多层嵌套):
[ {"id": "id1", "values": ["one", "two"]}, {"id": "id2", "values": ["three"]} ]
需求是将每个对象的id字段与自身values数组的每个元素拼接为id-值格式的字符串,期望输出:
id1-one id1-two id2-three
使用jq可以通过以下命令实现正确结果:
.[] | .id as $ID | .values[] | $ID + "-" + .
但用yq执行类似逻辑时,会出现笛卡尔积式的错误输出(比如所有id和所有values元素交叉拼接),需要找到正确的yq实现方式。
解决方案
针对mikefarah/yq(当前主流的yq版本,支持JSON处理),正确的写法需要确保每个对象的id变量仅作用于自身的values遍历,避免上下文泄漏导致笛卡尔积:
基础场景命令
.[] | ( .id as $currentId | .values[] | $currentId + "-" + . )
多层嵌套场景示例
如果你的JSON是多层嵌套结构,比如:
{ "parent": { "items": [ {"id": "id1", "values": ["one", "two"]}, {"id": "id2", "values": ["three"]} ] } }
只需调整遍历路径即可:
.parent.items[] | ( .id as $currentId | .values[] | $currentId + "-" + . )
原理说明
yq的变量作用域规则和jq略有差异:如果不将id赋值与values遍历的逻辑用括号包裹,$currentId会脱离当前对象的上下文,最终遍历所有对象的id和所有values元素,从而产生笛卡尔积错误。用括号将每个对象的处理逻辑包裹后,就能确保每个id只和自身所属的values元素进行拼接。
内容的提问来源于stack exchange,提问作者pmqs
相关产品推荐
相关产品推荐

