#json #powershell #amazon-cloudformation
#json #powershell #aws-облачная информация
Вопрос:
Ниже я подготовил шаблон формирования облака в формате json:
{
"AWSTemplateFormatVersion": "2010-09-09",
"Resources": {
"Baseline": {
"Properties": {
"ApprovalRules": {
"PatchRules": [
{
"PatchFilterGroup": {
"PatchFilters": [
{
"Values": [],
"Key": ""
},
{
"Values": [],
"Key": ""
},
{
"Values": [],
"Key": ""
}
]
}
}
]
}
}
}
}
}
Мне нужно ввести содержимое в этот файл json, поэтому я подготовил код. Мне нужно ввести два массива: Values
и Key
function ObjectBuilder {
param (
$Values,
$Key
)
$counter = 0
$objecttoinjectArray = @()
foreach ($element1 in $Values) {
$objecttoinject = [pscustomobject][ordered] @{
Values = $element1
Key = $Key[$counter]
}
$objecttoinjectArray = $objecttoinject
$counter
}
return $objecttoinjectArray
}
$filename = "Matrix.json"
$content = Get-Content -Path .$filename
$jsoncontent = $content | ConvertFrom-Json
$jsonbuild = $jsoncontent.Resources.Baseline.Properties
$Values = @("BMW, Audi", "Fiat, Ferrari, Porsche, Toyota", "*")
$Key = @("Standard","High","Premium")
$objecttoinjectArray = ObjectBuilder -Values $Values -Key $Key
$jsonbuild.ApprovalRules.PatchRules.PatchFilterGroup.PatchFilters = $objecttoinjectArray
$jsoncontent |
ConvertTo-Json -Depth 15 |
Set-Content .tests.json
И в качестве вывода я вижу неправильно отформатированный файл json, приведенный ниже:
{
"AWSTemplateFormatVersion": "2010-09-09",
"Resources": {
"Baseline": {
"Properties": {
"ApprovalRules": {
"PatchRules": [
{
"PatchFilterGroup": {
"PatchFilters": [
{
"Values": "BMW, Audi",
"Key": "Standard"
},
{
"Values": "Fiat, Ferrari, Porsche, Toyota",
"Key": "High"
},
{
"Values": "*",
"Key": "Premium"
}
]
}
}
]
}
}
}
}
}
Правильная структура должна выглядеть так, как показано ниже, эта структура не принята AWS cloudformation:
{
"AWSTemplateFormatVersion": "2010-09-09",
"Resources": {
"Baseline": {
"Properties": {
"ApprovalRules": {
"PatchRules": [
{
"PatchFilterGroup": {
"PatchFilters": [
{
"Values": [
"BMW",
"Audi"
],
"Key": "Standard"
},
{
"Values": [
"Fiat",
"Ferrari",
"Porsche",
"Toyota"
],
"Key": "High"
},
{
"Values": [
"*"
],
"Key": "Premium"
}
]
}
}
]
}
}
}
}
}
Комментарии:
1. Совет профессионала: вы всегда должны использовать правильные отступы в своих функциях, что сделает ваш код намного более читаемым и удобным для обслуживания, для вас и других.
Ответ №1:
Это потому, что каждый ваш элемент $Values
является строкой, а не массивом ( "BMW, Audi"
вместо "BMW", "Audi"
) и будет добавлен в JSON как таковой.
В зависимости от того, откуда вы получаете эти значения, существует несколько вариантов:
Если строки поступают из файла, вам придется разделить их:
$objecttoinject = [pscustomobject]@{
# split up the string into an actual array of the values
Values = $element1 -split ", "
Key = $Key[$counter]
}
(кстати, вы можете опустить [ordered]
ускоритель, потому что это уже подразумевается [pscustomobject]
)
Если они действительно буквально определены внутри вашего скрипта, просто измените его тоже:
$Values = @(@("BMW", "Audi"), @("Fiat", "Ferrari", "Porsche", "Toyota"), @("*"))
Или, что еще лучше, используйте хеш-таблицу:
$hashtable = @{
Standard = "BMW", "Audi"
High = "Fiat", "Ferrari", "Porsche", "Toyota"
Premium = "*"
}
$objecttoinjectArray = $hashtable.GetEnumerator() | foreach {
[pscustomobject] @{
Values = @($_.Value)
Key = $_.Key
}
}