【问题标题】:Unexpected array to string conversion意外的数组到字符串的转换
【发布时间】:2016-04-10 07:13:29
【问题描述】:

我正在尝试将我的数据打包到对象中,然后再使用ConvertTo-Json 显示它们。下面的测试用例完美地展示了我如何处理数据以及发生了什么问题:

$array = @("a","b","c")
$data = @{"sub" = @{"sub-sub" = $array}}
$output = @{"root" = $data}
ConvertTo-Json -InputObject $data
ConvertTo-Json -InputObject $output

输出(为清晰起见手动格式化):

          { "sub": { "sub-sub": [ "a", "b", "c" ] }}
{ "root": { "sub": { "sub-sub": "a b c" } }}

如果没有这种奇怪的隐式转换,有什么方法可以将 $data 分配给 $output?

【问题讨论】:

  • ConvertTo-Json -InputObject $output -Depth 3
  • 谢谢! ...虽然 -Depth 1 为“sub-sub”提供 System.Collections.Hashtable 但 -Depth 2 为 ["a","b","c"] 提供了 "a b c" 而不是 Object[] 我认为这很不合逻辑
  • Depth 只是 PowerShell 将“解开”值的嵌套级别数。否则,它将默认为对象字符串表示,这正是您所看到的
  • 字符串表示是指“[string]”而不是“... | Out-String”。现在很清楚了。
  • 正确,对象本身被转换为字符串

标签: arrays string powershell casting


【解决方案1】:

如 cmets 中所述,ConvertTo-Json 将尝试展平对象结构超出最大嵌套级别或深度,方法是将其找到的任何对象转换为超出该级别字符串的深度。

默认深度为 2,但您可以使用 Depth 参数指定它应该更深:

PS C:\> @{root=@{level1=@{level2=@("level3-1","level3-2")}}}|ConvertTo-Json
{
    "root":  {
        "level1":  {
            "level2":  "level3-1 level3-2"
        }
    }
}
PS C:\> @{root=@{level1=@{level2=@("level3-1","level3-2")}}}|ConvertTo-Json -Depth 3
{
    "root":  {
        "level1":  {
            "level2":  [
                "level3-1",
                "level3-2"
            ]
        }
    }
}

【讨论】:

    猜你喜欢
    • 2023-03-06
    • 2017-08-11
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 2016-08-29
    • 2013-11-03
    • 1970-01-01
    相关资源
    最近更新 更多