Powershell — создание файла json

#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
    }
}