Powershell:比较对象不比较嵌套对象

Powershell: Compare-object not comparing nested objects

提问人:Eris 提问时间:7/17/2014 更新时间:7/17/2014 访问量:2315

问:

或者我如何停止担心并学会爱上弦乐收藏

给定以下两个 json 字符串:

$jsonString1 = '{ "baz": "quuz", "cow": [ "moo", "CUD" ], "foo": "bar" }'
$jsonstring2 = '{ "baz": "quuz", "cow": [ "moo", "GRASS" ], "foo": "bar" }'

我想了解它们所代表的对象的差异

<# First attempt: Convert each to an object, then compare normally #>
function Compare-Json {
    <# Make powershell objects from each string #>
    $obj1 = $jsonString1 | ConvertFrom-Json
    $obj2 = $jsonstring2 | ConvertFrom-Json

    Compare-Object $obj1 $obj2
}

PS E:\temp> Compare-Json

PS E:\temp> 

是的,这根本没有输出。

当前的解决方法是将 json 转换为对象,再转换回字符串,然后拆分字符串,最后比较每个集合

function Compare-Json {
    <# Convert to pretty json, then split to make a string array #>
    $obj1 = $($jsonString1 | ConvertFrom-Json | ConvertTo-Json) -split ([Environment]::NewLine)
    $obj2 = $($jsonstring2 | ConvertFrom-Json | ConvertTo-Json) -split ([Environment]::NewLine)

    Compare-Object $obj1 $obj2
}


PS E:\temp> Compare-Json

InputObject      SideIndicator                                               
-----------      -------------                                               
"GRASS"          =>                                                          
"CUD"            <=                                                          

PS E:\temp> 

有没有更简单的方法来深度比较两个对象?

JSON PowerShell 比较

评论

0赞 Timothy Blaisdell 10/30/2020
如果两个 JSON 字符串中的属性顺序不对,但对象相同,您的解决方法是否会失败?例如,一个解析为 '{“field1”:“value1”, “field2”:“value2”}',另一个解析为 '{“field2”:“value2”, “field1”:“value1”}' 您可能希望将这两者进行比较为相同,不是吗?但他们不会。

答:

0赞 mjolinor 7/17/2014 #1

不知道它是否更好,但是:

$jsonString1 = '{ "baz": "quuz", "cow": [ "moo", "CUD" ], "foo": "bar" }'
$jsonstring2 = '{ "baz": "quuz", "cow": [ "moo", "GRASS" ], "foo": "bar" }'

compare $jsonString1.split(',:[]{}') $jsonString2.split(',:[]{}')


InputObject                                          SideIndicator                                      
-----------                                          -------------                                      
 "GRASS"                                             =>                                                 
 "CUD"                                               <=                                                 

评论

1赞 Timothy Blaisdell 10/30/2020
这些解决方案都不可靠,因为它们依赖于 JSON 中属性的排序。在您的示例中,如果首先为两个对象中的一个列出“foo”属性,最后为另一个对象列出“foo”属性,则即使它们之间的所有值都相同,这些对象也会比较不同。