ConvertTo-JSON是一个包含单个项目的数组

Lug*_*age 34 powershell powershell-3.0

我正在尝试创建一个JSON序列化的数组.当该数组只包含一个项时,我得到一个字符串,而不是一个字符串数组(在JSON中).

多个项目(按预期工作):

PS C:\> @("one", "two") | ConvertTo-JSON
[
    "one",
    "two"
]
Run Code Online (Sandbox Code Playgroud)

单项数组(不符合预期):

PS C:\> @("one") | ConvertTo-JSON
"one"
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

Ans*_*ers 51

尝试没有管道:

PS C:\> ConvertTo-Json @('one', 'two')
[
    "one",
    "two"
]
PS C:\> ConvertTo-Json @('one')
[
    "one"
]
Run Code Online (Sandbox Code Playgroud)

  • 啊,是的.我看到在这种情况下使用管道是多么模糊.谢谢.你让我意识到它不是特定于ConvertTo-JSON的,而是一个一般的powershell-array-pipline问题,它引导我:http://superuser.com/questions/414650/why-does-powershell-silently-convert-a-string - 阵列与 - 一个项目到一个字符串 (10认同)
  • @Luggage 要是有理智就好了:`@(@(1)) | ConvertTo-Json` - 仍然“NOPE” (2认同)
  • 实际上管道方法首先是*错误的*,数组在传递到管道时总是被迭代。幸运的是,ConvertTo-Json 的行为是将所有管道输入收集到一个数组中并输出一个对象,否则结果将是 2 个 JSON 对象,都是一个字符串。 (2认同)

nkr*_*ron 13

我也遇到了这个问题但是因为我的结构太深而且ConvertTo-Json将一定深度以下的所有东西变平为一个字符串.

例如:

PS C:\> $MyObject = @{ "a" = @{ "b" = @{ "c" = @("d") } } }
PS C:\> ConvertTo-Json $MyObject
{
    "a":  {
              "b":  {
                        "c":  "d"
                    }
          }
}
Run Code Online (Sandbox Code Playgroud)

要解决此问题,您可以将更大的值传递给-Depth

PS C:\> ConvertTo-Json $MyObject -Depth 100
{
    "a":  {
              "b":  {
                        "c":  [
                                  "d"
                              ]
                    }
          }
}
Run Code Online (Sandbox Code Playgroud)


DSp*_*rit 9

我刚刚遇到了同样的问题,并发现您只需将 an 附加-AsArrayConvertTo-Json命令即可。\n示例:

\n
\xe2\x9d\xaf @("one") | ConvertTo-Json -AsArray       \n[\n  "one"\n]\n
Run Code Online (Sandbox Code Playgroud)\n
\xe2\x9d\xaf @("one", "two") | Convert-ToJson -AsArray\n[\n  "one",\n  "two"\n]\n
Run Code Online (Sandbox Code Playgroud)\n

  • `-AsArray` 参数是 PowerShell 7.x 中的新参数,这应该是推荐的解决方案。 (2认同)

小智 6

在@前面放置一个,:

,@("one") | ConvertTo-Json
[
  "one"
]
Run Code Online (Sandbox Code Playgroud)