我正在加载一个包含一些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[]}"
}]
为什么会这样?有没有办法确保语法不会改变?
答案 0 :(得分:5)
ConvertTo-Json具有Depth
参数,用于控制JSON表示中包含多少级别的包含对象。默认值为2
。 ConvertTo-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
}
]