使用Powershell更新JSON文件中的对象

使用Powershell更新JSON文件中的对象,powershell,Powershell,我正在尝试使用Powershell更新以下文件中的列表对象: { "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#", "contentVersion": "1.0.0.0", "parameters": { "environment&q

我正在尝试使用Powershell更新以下文件中的列表对象:

{
"$schema":  "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
"contentVersion":  "1.0.0.0",
"parameters":  {
    "environment":  {
            "value":  ""
        },
    "keyVaultAccessPolicies":  {
        "value":  {
            "list": []
        }
    }
}
}

这是我迄今为止编写的Powershell:

$parametersTemplate = "C:\deploy.parameters.json"
$parametersJson = Get-Content $parametersTemplate -Raw | ConvertFrom-Json
$parametersJson.parameters.keyVaultAccessPolicies.value.list = $armAccessPolicies
$parametersJson | ConvertTo-Json | % { [System.Text.RegularExpressions.Regex]::Unescape($_) } | Set-Content $parametersTemplate
$ArmaccessPolicys是一个json字符串,如下所示:

[
{
    "tenantId":"**************",
    "objectId":"**************",
    "permissions":{"keys":"","secrets":"Get","certificates":"","storage":""}
},
{
    "tenantId":"**************",
    "objectId":"**************",
    "permissions":{"keys":"","secrets":"Get","certificates":"","storage":""}
}
]
"keyVaultAccessPolicies":  {
      "value":  {
           "list": [...]
      }
  }
$parametersTemplate = "C:\deploy.parameters.json"
$parametersJson = Get-Content $parametersTemplate -Raw | ConvertFrom-Json
# See, we are not setting the json string but rather the resulting psobject.
$parametersJson.parameters.keyVaultAccessPolicies.value.list = ($armAccessPolicies | ConvertFrom-Json) 

$parametersJson | ConvertTo-Json -Depth 10 | % { [System.Text.RegularExpressions.Regex]::Unescape($_) } | Set-Content $parametersTemplate
更新JSON文件时,我得到的结果如下:

"keyVaultAccessPolicies":  {
      "value":  "@{list=[...]}"
  }
我想要一些建议,因此文件如下所示:

[
{
    "tenantId":"**************",
    "objectId":"**************",
    "permissions":{"keys":"","secrets":"Get","certificates":"","storage":""}
},
{
    "tenantId":"**************",
    "objectId":"**************",
    "permissions":{"keys":"","secrets":"Get","certificates":"","storage":""}
}
]
"keyVaultAccessPolicies":  {
      "value":  {
           "list": [...]
      }
  }
$parametersTemplate = "C:\deploy.parameters.json"
$parametersJson = Get-Content $parametersTemplate -Raw | ConvertFrom-Json
# See, we are not setting the json string but rather the resulting psobject.
$parametersJson.parameters.keyVaultAccessPolicies.value.list = ($armAccessPolicies | ConvertFrom-Json) 

$parametersJson | ConvertTo-Json -Depth 10 | % { [System.Text.RegularExpressions.Regex]::Unescape($_) } | Set-Content $parametersTemplate

当您说
$armAccessPolices
是一个json字符串时,您可以回答自己的问题

您正在向
$parametersJson.parameters.KeyVault AccessPolicys.value.list
添加字符串

您想要的是附加一个列表。 为此,您需要先将
$armAccessPolicies
转换为PSObject,然后将所有内容转换回最终的json,如下所示:

[
{
    "tenantId":"**************",
    "objectId":"**************",
    "permissions":{"keys":"","secrets":"Get","certificates":"","storage":""}
},
{
    "tenantId":"**************",
    "objectId":"**************",
    "permissions":{"keys":"","secrets":"Get","certificates":"","storage":""}
}
]
"keyVaultAccessPolicies":  {
      "value":  {
           "list": [...]
      }
  }
$parametersTemplate = "C:\deploy.parameters.json"
$parametersJson = Get-Content $parametersTemplate -Raw | ConvertFrom-Json
# See, we are not setting the json string but rather the resulting psobject.
$parametersJson.parameters.keyVaultAccessPolicies.value.list = ($armAccessPolicies | ConvertFrom-Json) 

$parametersJson | ConvertTo-Json -Depth 10 | % { [System.Text.RegularExpressions.Regex]::Unescape($_) } | Set-Content $parametersTemplate
这里唯一有意义的更改是
.list
赋值,它现在被设置为
$ArmacessPolicys
的psobject表示形式,而不是通过
($ArmacessPolicys | ConvertFrom Json)


注意:您还应该将深度定义为大于4的值(默认值),以避免第4层之后的数据丢失。

当您说
$armAccessPolices
是json字符串时,您可以回答自己的问题

您正在向
$parametersJson.parameters.KeyVault AccessPolicys.value.list
添加字符串

您想要的是附加一个列表。 为此,您需要先将
$armAccessPolicies
转换为PSObject,然后将所有内容转换回最终的json,如下所示:

[
{
    "tenantId":"**************",
    "objectId":"**************",
    "permissions":{"keys":"","secrets":"Get","certificates":"","storage":""}
},
{
    "tenantId":"**************",
    "objectId":"**************",
    "permissions":{"keys":"","secrets":"Get","certificates":"","storage":""}
}
]
"keyVaultAccessPolicies":  {
      "value":  {
           "list": [...]
      }
  }
$parametersTemplate = "C:\deploy.parameters.json"
$parametersJson = Get-Content $parametersTemplate -Raw | ConvertFrom-Json
# See, we are not setting the json string but rather the resulting psobject.
$parametersJson.parameters.keyVaultAccessPolicies.value.list = ($armAccessPolicies | ConvertFrom-Json) 

$parametersJson | ConvertTo-Json -Depth 10 | % { [System.Text.RegularExpressions.Regex]::Unescape($_) } | Set-Content $parametersTemplate
这里唯一有意义的更改是
.list
赋值,它现在被设置为
$ArmacessPolicys
的psobject表示形式,而不是通过
($ArmacessPolicys | ConvertFrom Json)


注意:您还应该将深度定义为大于4的值(默认值),以避免第4层之后的数据丢失。

谢谢。现在一切正常。我想我已经盯着它看太久了,看不到明显的答案。另外,谢谢你关于深度的建议。我看到的是一些对象而不是值,增加深度已经解决了这个问题。有没有一种方法可以使$ArmacessPolicys在转换为json时始终被视为一个数组?“list”是一个数组,但当$ArmacessPolicys.PSobject.BaseObject.Count=1时,“list”被视为一个对象,因此我得到了一个错误的json文件。解决它:$ArmacessPolicys=[PSCustomObject]@{list=$ArmacessPolicys}然后是$parametersJson.parameters.KeyvaultAccessPolicys.value=$AccessPolicysObject(更新值而不是list)谢谢你。现在一切正常。我想我已经盯着它看太久了,看不到明显的答案。另外,谢谢你关于深度的建议。我看到的是一些对象而不是值,增加深度已经解决了这个问题。有没有一种方法可以使$ArmacessPolicys在转换为json时始终被视为一个数组?“list”是一个数组,但当$ArmacessPolicys.PSobject.BaseObject.Count=1时,“list”被视为一个对象,因此我得到了一个错误的json文件。解决它:$ArmacessPolicys=[PSCustomObject]@{list=$ArmacessPolicys}然后是$parametersJson.parameters.KeyvaultAccessPolicys.value=$AccessPolicysObject(更新值而不是list)