我正在搜索一个CLI (Windows)工具来比较两个JSON文件。
诀窍是JSON文件中的数据对象可能有不同的顺序(位置)。即使数据对象的顺序发生了变化,如果对象本身没有变化,我也希望工具能够报告这些文件是等价的。
我想从脚本中运行这个工具,所以如果文件是相同的,它需要在没有交互的情况下运行。当文件不等价时,我可以强制使用UI,但这不是首选。
<#>Because它将从脚本中运行,一个困难的要求是它返回一个错误级别的环境变量,我可以使用它来确定两个JSON文件是否等价。
CLI确实是我所喜欢的,但是一个符合上述标准的GUI也能工作。所以请不要犹豫,也可以推荐。
发布于 2020-12-29 11:52:34
您可以通过jq (可用作为一个小的Windows二进制文件)运行这两个文件,让jq根据您的需要对两个文件中的数据进行漂亮的打印和排序,然后执行“普通”diff (使用WinDiff、Meld、漫射)。
shell命令将是
< file1.json jq 'keys' > file1.sorted.json
< file2.json jq 'keys' > file2.sorted.json
diff file1.sorted.json file2.sorted.json
# or better
diff -q file1.sorted.json file2.sorted.json
#
# -q, --brief
# report only when files differ
# if output of diff -q is nonempty, files differ -> raise an error如果您知道发生了什么,请继续处理未修改的文件。
这显然只有在JSON对象的键不同的情况下才能起作用。这还假设保留了类型信息(例如,浮点数的字符串表示在两个文件之间没有区别)
如果JSON对象在对象值上存在差异,或者如果值包含嵌套对象(它们本身在值或子键排序上可能不同),或者如果您希望第一级键的顺序保持不变,但只需要通过其他条件比较嵌套的“值-对象”,那么您将需要更复杂的jq命令。查看stackoverflow.com -一些难以置信的jq专家在那里。
发布于 2020-12-29 06:37:23
您试过查看GNU (比较)吗?Diff特别有"-B“或”--忽略-空白-行“开关,它”忽略行为空的更改“(另见关于堆栈交换的类似问题)。
还有其他方法和变体来实现您提到的事情,例如使用维迪夫。
如果您想采用编程方法,则可能需要查看Levenshtein距离,它是度量两个字符串之间差异的度量标准。
https://softwarerecs.stackexchange.com/questions/77471
复制相似问题