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