PowerShell ConvertTo-JSON с несколькими массивами

Я пытаюсь преобразовать данные в JSON в качестве входных данных для REST API. Проблема, с которой я столкнулся, состоит в том, что данные должны состоять из нескольких уровней глубины (из-за отсутствия лучших слов). Код, который я использую сейчас:

(@{name = "Contoso"; all_assets = "false"; all_users="false"; rules= @{type="fqdn"; operator="match"; terms=@("contoso") } }| ConvertTo-Json)

теперь вывод:

{
    "all_users":  "false",
    "name":  "Contoso",
    "all_assets":  "false",
    "rules":  {
                  "operator":  "match",
                  "terms":  [
                                "contoso"
                            ],
                  "type":  "fqdn"
              }
}

REST-Api жалуется, что данные содержат недопустимые символы. Глядя на вывод, раздел "rules:" содержит { } вместо [ ]. Я пробовал разные уловки, но не могу понять этого.

Кто-нибудь знает, что я здесь делаю не так?

2 ответа

Если ты хочешь rules чтобы содержать массив объектов вместо объекта со свойствами, заключите все, что входит в rules с @().

Потому как terms затем становится 3-м уровнем, вам нужно добавить параметр -Depth в командлет ConvertTo-Json:

Для лучшей читаемости я не делал это однострочным

@{ 
   name       = "Contoso"
   all_assets = "false"
   all_users  = "false"
   rules      = @(
                   @{
                      type     = "fqdn"
                      operator = "match"
                      terms    = @("contoso")
                   }
                )
} | ConvertTo-Json -Depth 3

Выход:

{
    "all_users":  "false",
    "name":  "Contoso",
    "all_assets":  "false",
    "rules":  [
                  {
                      "operator":  "match",
                      "terms":  [
                                    "contoso"
                                ],
                      "type":  "fqdn"
                  }
              ]
}

Для чего это стоит...
Не ответ на неожиданные результаты ConvertTo-Json? Ответ: по умолчанию у него есть проблема с глубиной 2, но как обычно можно построить выражение PowerShell изJson файл с использованием ConvertTo-Expression командлет:

'{
    "all_users":  "false",
    "name":  "Contoso",
    "all_assets":  "false",
    "rules":  [
                  {
                      "operator":  "match",
                      "terms":  [
                                    "contoso"
                                ],
                      "type":  "fqdn"
                  }
              ]
}' | ConvertFrom-Json | ConvertTo-Expression

[pscustomobject]@{
        'all_users' = 'false'
        'name' = 'Contoso'
        'all_assets' = 'false'
        'rules' = ,[pscustomobject]@{
                'operator' = 'match'
                'terms' = ,'contoso'
                'type' = 'fqdn'
        }
}
Другие вопросы по тегам