使用jq对JSON数组内字符串排序 实现文件相等性diff校验
解决方案
你可以直接用jq的路径匹配+更新运算符实现指定数组的降序排序,同时保留其他原有结构不变,再配合-S参数全局排序键名,就能完全消除顺序差异实现diff校验。
1. 单文件排序命令
jq -S '(.components."test.data.app"[] | .config."allowed-test-mapper-data" | select(. != null)) |= (sort | reverse)' input.json > sorted_output.json
参数说明:
- 路径表达式精准定位
components.test.data.app数组下所有存在allowed-test-mapper-data键的元素,select(. != null)过滤掉不存在该键的数组项,避免报错 |=是更新赋值运算符,仅修改匹配到的数组内容,其余JSON结构完全保留sort | reverse实现字符串按字母降序排序
2. 直接对比两个JSON的命令
如果不需要生成中间排序文件,可以直接用进程替换完成实时排序对比:
diff \ <(jq -S '(.components."test.data.app"[] | .config."allowed-test-mapper-data" | select(. != null)) |= (sort | reverse)' file1.json) \ <(jq -S '(.components."test.data.app"[] | .config."allowed-test-mapper-data" | select(. != null)) |= (sort | reverse)' file2.json)
如果两个文件仅存在元素/数组顺序差异,执行上述命令后无任何输出即代表内容完全一致。
效果验证
对你提供的示例JSON执行命令后,allowed-test-mapper-data数组的输出结果为:
["usa", "somedata", "canada", "brother", "alfred", "alcohol"]
完全符合降序排序要求。
内容的提问来源于stack exchange,提问作者user16705303
相关产品推荐
相关产品推荐

