json - 为什么在转换 JSON 时,powershell 在单行和两行中给出不同的结果?

标签 json powershell

概述

在 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/

相关文章:

javascript - 在 JavaScript 中解析 JSON 时出现意外错误

powershell - 使用 Start-Process 保留环境变量

string - PowerShell 使用字符串中的变量作为参数传递

PowerShell 排序的整数数组数组不起作用

json - 我如何使用 Go 漂亮地打印 JSON?

arrays - 如何在 native react 中将json数据与数组映射

java - 我如何从 Java 中的 Delphi 读取我的 Json 字符串

php - 来自 json 对象的快速 PUT API

arrays - 多维数组如何在PowerShell中工作?

windows - git diff 的输出在 powershell 中处理不正确