如何在powershell中比较JSON

man*_*nan 6 powershell mulesoft

我有一个要求,需要将文件中的 JSON 对象与进入 Anypoint MQ 队列的 JSON 消息进行比较。我能够从队列中获取消息。我使用了下面的脚本,但它不起作用。我都做了-eqCompare-Object但它们不起作用。

$po_ps_output = $filemessagecontent | ConvertFrom-Json
$po_python_output = $mqmessagecontent.body | ConvertFrom-Json
$result = $po_ps_output -eq $po_python_output
Run Code Online (Sandbox Code Playgroud)

mkl*_*nt0 13

如果您只想知道两个源自 JSON 的对象是否不同,而不需要知道如何不同

$contentEqual = ($po_ps_output | ConvertTo-Json -Compress) -eq 
                ($po_python_output | ConvertTo-Json -Compress)
Run Code Online (Sandbox Code Playgroud)

笔记:

  • ConvertTo-Json默认为序列化深度2--Depth <n>如果您的数据嵌套得更深,请使用它以避免截断(潜在的数据丢失) - 请参阅这篇文章

  • 转换回 JSON 似乎是一个不必要的步骤,但它将-Compress输出格式标准化为单行,没有额外的空格,这确保了输入中格式的偶然变化(如果您直接使用了输入 JSON 文本)被忽略。


如果您想知道这两个源自 JSON 的对象有何不同:

注意:以下内容仅在以下有限场景中有用- 通用、强大的解决方案将需要更多的努力:

  • 输入具有相同的结构,仅属性名称/值不同。

  • (等效)属性的顺序是相同的

Compare-Object (($po_ps_output | ConvertTo-Json) -split '\r?\n') `
               (($po_python_output | ConvertTo-Json) -split '\r?\n')
Run Code Online (Sandbox Code Playgroud)

输出将显示不同的行,每行代表一个属性或原始值;例如:

InputObject                   SideIndicator
-----------                   -------------
      "DOB":  "12-03-1994"    =>
      "DOB":  "12-03-1999"    <=
Run Code Online (Sandbox Code Playgroud)

笔记:

  • =>/<=表示该行是 RHS/LHS 特有的。

  • 同样,显式重新转换为 JSON 是为了确保格式统一;在本例中,是一种面向行的漂亮打印格式,可以进行逐个属性的比较。

  • 同样,您可能必须使用它-Depth来防止数据被截断。

  • 对于差异的交互式检查,您可以尝试使用差异可视化工具,例如 Visual Studio Code 中内置的工具,通过文件将两个 JSON 字符串以漂亮打印的形式传递到
    code --diff <file1> <file2>.


至于你尝试过的

ConvertFrom-Json创建[pscustomobject]实例,因此您要比较该类型的两个实例:

  • 如果您使用-eq,则会测试引用相等性[pscustomobject],因为是引用类型并且不实现自定义相等性比较。

    • 因此,$po_ps_output -eq $po_python_output只有$true当两个变量指向内存中的同一个对象时才会出现 - 这显然不是这里的情况,所以你总是会得到$false.
  • 如果您使用Compare-Object,则两个实例将按其.ToString()值进行比较。

    • 遗憾的是,从 PowerShell Core 7.0.0-preview.4 开始,调用 的.ToString()实例会[pscustomobject]产生空字符串( ''),这应该被视为一个错误 - 请参阅此 GitHub 问题

    • 因此,Compare-Object $po_ps_output $po_python_output(毫无帮助)认为两个实例相等并且不返回任何内容,因为默认情况下不输出相等的对象(用于-IncludeEqual包含它们)。