ConvertFrom-JSON从对象中剥离数组

时间:2016-02-18 15:28:26

标签: json powershell

我正在加载一个包含一些Json的文本文件来编辑属性。但是,在修改内容并将其写入文件后,Json变为无效.I

我使用以下PowerShell修改文件:

$manifest = Get-Content $PathToManifest -Raw | ConvertFrom-Json

#modify Json    

Set-Content -Path $PathToManifest -Value ( $manifest | ConvertTo-Json)  

我的Json文件中的以下代码段已损坏:

 "contributions": [
    {
      "id": "sample-data-widget",
      "type": "ms.vss-dashboards-web.widget",
      "targets": ["ms.vss-dashboards-web.widget-catalog"],
      "properties": "@{name=Sample Data; description=Create sample data in a VSTS project.; previewImageUrl=img/logo.png; uri=index.html; supportedSizes=System.Object[]; supportedScopes=System.Object[]}"
    }]

加载Json并将其写回文件后,目标周围的数组语法就消失了:

  "contributions": [
    {
      "id": "sample-data-widget",
      "type": "ms.vss-dashboards-web.widget",
      "targets": "ms.vss-dashboards-web.widget-catalog",
      "properties": "@{name=Sample Data; description=Create sample data in a VSTS project.; previewImageUrl=img/logo.png; uri=index.html; supportedSizes=System.Object[]; supportedScopes=System.Object[]}"
    }]

为什么会这样?有没有办法确保语法不会改变?

1 个答案:

答案 0 :(得分:5)

ConvertTo-Json具有Depth参数,用于控制JSON表示中包含多少级别的包含对象。默认值为2ConvertTo-Json会在嵌套深度超过指定.ToString()的任何内容上调用Depth

所以你需要的是为Depth参数或([int]::MaxValue)指定足够大的数字。

Set-Content -Path $PathToManifest -Value ( $manifest | ConvertTo-Json -Depth ([int]::MaxValue))  

嵌套和ConvertTo-Json行为的示例:

$NestedArray = @(1,@(2,@(3,@(4))))

默认值:

$NestedArray | ConvertTo-Json

[
    1,
    {
        "value":  [
                      2,
                      [
                          3,
                          "4"
                      ]
                  ],
        "Count":  2
    }
]

根本没有嵌套:

$NestedArray | ConvertTo-Json -Depth 1

[
    1,
    {
        "value":  [
                      2,
                      "3 System.Object[]"
                  ],
        "Count":  2
    }
]

期望的结果:

$NestedArray | ConvertTo-Json -Depth 3

[
    1,
    {
        "value":  [
                      2,
                      [
                          3,
                          [
                              4
                          ]
                      ]
                  ],
        "Count":  2
    }
]