JQ技术问询:Winmerge中以指定JSON为模板排序目标JSON
解决方案
要实现以左侧JSON为模板排序右侧JSON字段,同时适配Winmerge的JQ插件(需同时处理两个文件),可以借助JQ的keys_unsorted函数和reduce操作实现,具体如下:
核心逻辑
- 提取左侧JSON的字段原始顺序(不做额外排序)
- 按该顺序重新排列右侧JSON的字段
- 可选:保留右侧独有的字段并追加到排序后的字段之后
适配Winmerge的JQ命令
Winmerge的JQ插件会将两个对比文件作为输入,使用--slurp参数将两个文件读入一个JSON数组(第一个元素为左侧模板,第二个为右侧待排序文件):
jq --slurp ' .[0] | keys_unsorted as $templateKeys | .[1] as $targetObj | reduce $templateKeys[] as $key ({}; .[$key] = $targetObj[$key]) | + ($targetObj | delpaths($templateKeys | map([.]))) '
命令说明
--slurp:把两个输入文件合并为一个JSON数组,.[0]对应左侧模板文件,.[1]对应右侧待排序文件keys_unsorted:获取左侧JSON对象的字段原始顺序(仅JQ 1.6+版本支持,低版本无此函数)reduce:遍历左侧模板的字段顺序,依次将右侧对应字段的值写入新对象,保证字段位置与左侧完全匹配- 最后一行
+ ($targetObj | delpaths(...)):将右侧独有的字段追加到排序后的对象末尾,不需要保留可直接删除该行
注意事项
- 必须使用JQ 1.6及以上版本,否则无法通过
keys_unsorted保留左侧的原始字段顺序 - 在Winmerge的JQ插件配置中直接填入上述命令,即可实现自动按左侧模板排序右侧文件后再对比
内容的提问来源于stack exchange,提问作者Oshida_BCF
相关产品推荐
相关产品推荐

