在powershell 3提示符下,我想调用RESTful服务,获取一些JSON,然后漂亮地打印它。我发现,如果将数据转换为powershell对象,然后再将powershell对象转换回json,则会得到一个漂亮的漂亮打印字符串。但是,如果我将这两个转换与一个管道组合成一个衬套,我将得到不同的结果。
TL; DR: 此:
PS> $psobj = $orig | ConvertFrom-JSON PS> $psobj | ConvertTo-JSON
…给我的结果与此不同:
PS> $orig | ConvertFrom-JSON | ConvertTo-JSON
[ { "Type": "1", "Name": "QA" }, { "Type": "2", "Name": "whatver" } ]
我将删除空白(因此适合一行…),将其转换为powershell对象,然后将其转换回JSON。这样效果很好,并给了我正确的数据:
PS> $orig = '[{"Type": "1","Name": "QA"},{"Type": "2","Name": "DEV"}]' PS> $psobj = $orig | ConvertFrom-JSON PS> $psobj | ConvertTo-JSON [ { "Type": "1", "Name": "QA" }, { "Type": "2", "Name": "DEV" } ]
但是,如果我将最后两个语句组合成一个直线,则会得到不同的结果:
PS> $orig | ConvertFrom-JSON | ConvertTo-JSON { "value": [ { "Type": "1", "Name": "QA" }, { "Type": "2", "Name": "DEV" } ], "Count": 2 }
注意添加了键“值”和“计数”。为什么有区别?我确定它与返回JSON对象而不是返回JSON数组的愿望有关,但是我不明白为什么我进行转换的方式会影响最终结果。
解决方案是用括号将前两个操作包装起来:
PS C:\> ($orig | ConvertFrom-JSON) | ConvertTo-JSON [ { "Type": "1", "Name": "QA" }, { "Type": "2", "Name": "DEV" } ]
括号使您可以一次获取前两个操作的输出。没有它们,powershell将尝试分别解析其获取的任何对象。PSCustomObject从的结果集合$orig | ConvertFrom-JSON包含两个PSCustomObjects用于1 / QA和2 / DEV的对,因此通过管道传递该集合的输出,powershell尝试一次处理键/值对。
PSCustomObject
$orig | ConvertFrom-JSON
PSCustomObjects
使用括号是对输出进行“分组”的一种较短方法,使您可以在不进行变量的情况下对其进行操作。