我如何将下面的JSON弄平,有时在那里有权限,有时不能,假设我无法控制JSON并添加一个权限:[]没有提供它。
{
"AVS": { "type": "host" },
"SQL1": {
"type": "host",
"permissions": [
{
"ad_account": "peter",
"role": "admin",
"is_group": false
}
]
},
"SQL2": {
"type": "host",
"permissions": [
{
"ad_account": "peter",
"role": "user",
"is_group": false
},
{
"ad_account": "peter2",
"role": "admin",
"is_group": false
}
]
}
}
我这样解析的是:
locals {
# Load the default folders from a JSON file.
default_folders = jsondecode(file("${path.module}/folders.json"))
# flatten ensures that this local value is a flat list of objects, rather
# than a list of lists of objects, including the additional_folders from the
# datacenter configuration.
folders = flatten([
for datacenter_key, datacenter in var.datacenters : [
for folder_key, folder in local.default_folders : {
datacenter_key = datacenter_key
datacenter_moid = datacenter.datacenter_moid
name = folder_key
type = folder.type
# permissions = try(folder.permissions, tolist([]))
# permissions = folder.permissions == null ? tolist([]) : folder.permissions
# permissions = can(folder.permissions) ? folder.permissions : tolist([])
# permissions = folder.permissions
}
]
])
}
resource "vsphere_folder" "folder" {
# local.folders is a list, so we must now project it into a map
# where each key is unique. We'll combine the datacenter and folder keys to
# produce a single unique key per instance.
for_each = tomap({
for folder in local.folders : "${folder.datacenter_moid}.${folder.name}" => folder
})
datacenter_id = each.value.datacenter_moid
path = each.value.name
type = each.value.type
}
我无法弄清楚如何解析权限,以便它可能是丢失的属性,如果它是分配一个空列表错误是错误:
│ Error: Invalid function argument
│
│ on ../modules/vcenter/folders.tf line 27, in resource "vsphere_folder" "folder":
│ 27: for_each = tomap({
│ 28: for folder in local.folders : "${folder.datacenter_moid}.${folder.name}" => folder
│ 29: })
│ ├────────────────
│ │ while calling tomap(v)
│ │ local.folders is tuple with 73 elements
│
│ Invalid value for "v" parameter: cannot convert object to map of any single type.
try
可以在JSON字符串中没有键
[]
时在数据转换过程中分配空的权限值:permissions
当键在解码后存在时,这将导致permissions = try(folder.permissions, [])
值,或者在解码后不存在键时为空。