使用jq向JSON模板数组添加生成元素时保留首个初始元素的问题
使用jq向JSON模板数组添加生成元素时保留首个初始元素的问题
看起来你遇到的核心问题是:在构造sections数组时,想要保留的固定首个元素被后续的管道表达式“覆盖”了——这是因为在jq的数组构造语法里,直接把固定元素和展开的管道结果用逗号分隔,并没有正确保留固定元素的位置,反而让管道的结果占据了整个数组。
解决这个问题的关键是把固定元素单独作为一个数组,再和从原JSON生成的元素数组合并,这样既能保证固定元素始终在数组第一位,又能按顺序追加后续生成的元素。
修正后的jq命令
echo '{"Results": [{"Input": [{"foo":" bar", "this": "that"}, {"foo": "bing"}]}]}' | \ jq '{"sections": [ {"first": "element", "that": "is needed at pos 0 in this array"} ] + [ .Results[] | .Input[]? | {"markdown": true, "facts":[{name: "MyFoo", value: .foo}]} ]}'
为什么这样写能解决问题?
[{"first": "element", ...}]单独定义了包含固定首元素的数组,确保它是sections的第一个元素;- jq的
+操作符可以直接拼接两个数组,把从原JSON生成的所有元素数组,追加到固定元素的后面; [ .Results[] | .Input[]? | ... ]把原JSON中Results.Input里的每个foo字段转换为目标格式,并收集成一个数组,保证生成元素的顺序和原数据一致。
执行后的结果
运行这个命令后,你会得到完全符合预期的输出:
{ "sections": [ { "first": "element", "that": "is needed at pos 0 in this array" }, { "markdown": true, "facts": [ { "name": "MyFoo", "value": " bar" } ] }, { "markdown": true, "facts": [ { "name": "MyFoo", "value": "bing" } ] } ] }
你之前尝试的链式jq命令用了.sections += [...],这种方式是把新元素追加到数组末尾,自然会打乱你想要的顺序;而数组拼接的方式从根本上保证了固定元素的首位优先级,同时不影响后续元素的生成顺序。
备注:内容来源于stack exchange,提问作者srick
相关产品推荐
相关产品推荐

