如何用jq递归排序JSON嵌套对象适配WinMerge QueryJSON插件对比?
给WinMerge QueryJSON插件用的递归JSON属性排序方案
递归排序所有层级对象的jq命令
直接用jq的walk函数递归遍历所有JSON节点,自动对每个嵌套对象的属性按键排序:
QueryJSON "walk(if type == \"object\" then to_entries | sort_by(.key) | from_entries else . end)"
这个命令会处理所有层级的对象——不管是顶层还是嵌套在N层里的子对象,都会把属性按键名排序,不用再手动逐个指定嵌套路径。
简单解释
walk(...):遍历JSON的每一个节点,对每个节点执行后续逻辑- 遇到对象类型的节点,就转成键值对数组、按键排序、再转回对象;非对象(数组、字符串、数字这些)保持原样
可选:扁平化JSON为路径-值结构
如果接受扁平化处理,也可以把整个JSON转成“路径-值”的键值对形式,这样对比时完全不用管嵌套顺序:
QueryJSON "reduce paths as $path ({}; .[[$path[]|tostring]|join(\".\")] = getpath($path))"
比如原JSON里的Person.Age会变成键"Person.Age",对应值30,所有层级的属性都会平铺展开,对比起来更直观。
为什么你之前的方法没效果?
- 原来的命令只处理了顶层对象,没递归处理嵌套节点
flatten是用来扁平化数组的,对对象结构不起作用,所以达不到预期效果
内容的提问来源于stack exchange,提问作者maximelian1986
相关产品推荐
相关产品推荐

