有没有一种方法可以获取“JSON 行”文件的差异?
Is there a method to obtain a diff for `JSON Lines` files?
有没有办法获取 JSON Lines
文件的差异?以防混淆,"JSON Lines",我指的是描述 here, which basically requires that every line is a valid JSON structure. Anyway, there's an answer 的格式,它讨论了使用 jq 来区分两个不同的 JSON 文件。
但是,那里的问题是希望 diff 不考虑列表内排序,而我确实关心该排序。此外,答案包含 jq 脚本,这些脚本只给出真或假的响应,不给出完整的差异。理想情况下,我想要一个完整的差异。有一个项目调用 json-diff 可以区分 JSON 文件,但它只适用于单个 JSON 实体,不适用于 JSON 行。
重申一下,是否有一种方法或类似 jq 脚本的东西可以获取 JSON 行格式文件的差异?
如果我对问题的理解正确,下面的内容应该可以解决问题。我假设您可以访问 jq 1.5,其中包括过滤器 walk/1(如果不是这种情况,很容易用定义补充下面的文件,该定义可以在网上找到,例如 [ =23=.jq 文件),并且你有一个相当现代的 Mac 或 Linux-like shell.
(1) 使用以下两行创建一个名为(比方说)jq-diff.jq 的文件:
def sortKeys: to_entries | sort | from_entries;
walk( if type == "object" then sortKeys else . end )
(2) 假设里面有JSON个实体的两个文件分别是FILE1和FILE2,那么运行以下命令之一,看你是否要JSON个实体在每个要排序的文件中:
diff <(jq -cf jq-diff.jq FILE1 | sort) <(jq -cf jq-diff.jq FILE2 | sort)
# OR:
diff <(jq -cf jq-diff.jq FILE1) <(jq -cf jq-diff.jq FILE2)
简要说明:
这里 jq 的作用是对对象中的键进行排序(不对数组进行排序)并以标准方式打印它们,每行一个(由 -c 选项提供)。
您可以使用 -s
标志将换行符分隔的 JSON 对象放入包含它们的 JSON 数组中,从而使它们有资格与 json-diff
进行比较.
有没有办法获取 JSON Lines
文件的差异?以防混淆,"JSON Lines",我指的是描述 here, which basically requires that every line is a valid JSON structure. Anyway, there's an answer
但是,那里的问题是希望 diff 不考虑列表内排序,而我确实关心该排序。此外,答案包含 jq 脚本,这些脚本只给出真或假的响应,不给出完整的差异。理想情况下,我想要一个完整的差异。有一个项目调用 json-diff 可以区分 JSON 文件,但它只适用于单个 JSON 实体,不适用于 JSON 行。
重申一下,是否有一种方法或类似 jq 脚本的东西可以获取 JSON 行格式文件的差异?
如果我对问题的理解正确,下面的内容应该可以解决问题。我假设您可以访问 jq 1.5,其中包括过滤器 walk/1(如果不是这种情况,很容易用定义补充下面的文件,该定义可以在网上找到,例如 [ =23=.jq 文件),并且你有一个相当现代的 Mac 或 Linux-like shell.
(1) 使用以下两行创建一个名为(比方说)jq-diff.jq 的文件:
def sortKeys: to_entries | sort | from_entries;
walk( if type == "object" then sortKeys else . end )
(2) 假设里面有JSON个实体的两个文件分别是FILE1和FILE2,那么运行以下命令之一,看你是否要JSON个实体在每个要排序的文件中:
diff <(jq -cf jq-diff.jq FILE1 | sort) <(jq -cf jq-diff.jq FILE2 | sort)
# OR:
diff <(jq -cf jq-diff.jq FILE1) <(jq -cf jq-diff.jq FILE2)
简要说明:
这里 jq 的作用是对对象中的键进行排序(不对数组进行排序)并以标准方式打印它们,每行一个(由 -c 选项提供)。
您可以使用 -s
标志将换行符分隔的 JSON 对象放入包含它们的 JSON 数组中,从而使它们有资格与 json-diff
进行比较.