【问题标题】:ConvertTo-JSON an array with a single itemConvertTo-JSON 具有单个项目的数组
【发布时间】:2013-09-10 20:39:00
【问题描述】:

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

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

PS C:\> @("one", "two") | ConvertTo-JSON
[
    "one",
    "two"
]

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

PS C:\> @("one") | ConvertTo-JSON
"one"

我错过了什么吗?

【问题讨论】:

    标签: powershell powershell-3.0


    【解决方案1】:

    尝试不使用管道:

    PS C:\> ConvertTo-Json @('one', 'two')
    [
        "one",
        "two"
    ]
    PS C:\> ConvertTo-Json @('one')
    [
        "one"
    ]

    【讨论】:

    • 啊,是的。我看到在这种情况下使用管道会变得模棱两可。谢谢你。你让我意识到这不是 ConvertTo-JSON 特定的,而是一般的 powershell-array-pipline 问题,这导致我:superuser.com/questions/414650/…
    • @Luggage 要是理智点就好了:@(@(1)) | ConvertTo-Json -- 仍然是“NOPE”
    • 实际上管道方法首先是错误,数组在传递到管道时总是被迭代。幸运的是ConvertTo-Json 的行为是将所有管道输入收集到一个数组中并输出一个对象,否则结果将是 2 个 JSON 对象,都是一个字符串。
    • @marsze 不,这完全是错误的,管道是嵌套的、基于参数的函数调用范例的反向数据方向的绝佳替代方案。裸列表在管道中迭代,是的,但是这样的列表可以包含任何对象的项目,包括数组。这将如何获得每个字符串的第二个单词的长度? 'hello there','it is i' | %{ ,@($_ -split ' ') } | %{ $_[1].Length }。我们也可以像这样对 ConvertTo 这样做; ,@(1) | ConvertTo-Json。 ConvertTo 自己搞砸了,它运行不正常。
    • @Hashbrown 我的措辞可能很不幸。任何集合类型(例如数组)在传递到管道的开头时都会被迭代。当然,这仅适用于第一级,因为元素和子元素本身可以是集合类型。这正是您在示例中演示的内容,您传入一个字符串数组,并在 each 单个元素上执行拆分。
    【解决方案2】:

    我也遇到了这个问题,但这是因为我的结构太深了,并且 ConvertTo-Json 将低于某个深度的所有内容展平为字符串。

    例如:

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

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

    PS C:\> ConvertTo-Json $MyObject -Depth 100
    {
        "a":  {
                  "b":  {
                            "c":  [
                                      "d"
                                  ]
                        }
              }
    }
    

    【讨论】:

      【解决方案3】:

      今天遇到了同样的问题。只是补充一下,如果你有这样的对象

      @{ op="replace"; path="clientName"; value="foo"}
      

      那么你必须将它指定为

      ConvertTo-Json @( @{ op="replace"; path="clientName"; value="foo"} )
      

      双@s 有时会变得混乱。

      【讨论】:

        【解决方案4】:

        我在一个对象中的子数组中遇到了这个问题。数组中有一个对象,ConvertTo-Json 正在删除数组中的对象。

        解决这个问题的两件事:

        我必须在ConvertTo-Json 上设置-Depth 参数

        $output = $body | ConvertTo-Json -Depth 10
        

        我必须将数组中的对象创建为哈希表,然后将其转换为对象

        $myArray.Add([pscustomobject]@{prop1 = ""; prop2 = "" })
        

        【讨论】:

          【解决方案5】:

          我刚刚遇到同样的问题并发现,您只需将-AsArray 附加到ConvertTo-Json 命令即可。 例子:

          ❯ @("one") | ConvertTo-Json -AsArray       
          [
            "one"
          ]
          
          ❯ @("one", "two") | Convert-ToJson -AsArray
          [
            "one",
            "two"
          ]
          

          【讨论】:

          • 这听起来像是一个有用的开关,但对我来说不存在。您使用的是哪个版本的 PowerShell?我在 5.1.19041.1320
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-07
          • 2010-10-30
          • 1970-01-01
          • 2019-12-25
          相关资源
          最近更新 更多