使用Powershell更新JSON文件中的对象
我正在尝试使用Powershell更新以下文件中的列表对象:使用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
{
"$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)