概述
在 powershell 3 提示符下,我想调用一个 RESTful 服务,获取一些 JSON,然后漂亮地打印它。我发现如果我将数据转换为 powershell 对象,然后将 powershell 对象转换回 json,我会得到一个 pretty-print 字符串。但是,如果我将这两种转换组合成一个带管道的单衬管,我会得到不同的结果。
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
}
注意键“value”和“Count”的添加。为什么有区别?我确信这与返回 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 尝试一次处理一个键/值对。使用括号是“分组”输出的一种更短的方式,允许您在不创建变量的情况下对其进行操作。
关于json - 为什么在转换 JSON 时,powershell 在单行和两行中给出不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20848507/