You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Terraform中从JSON数据提取id属性值到列表变量

Terraform 提取JSON文件所有id属性值的实现方案

原有代码问题说明

  • 根因1:jsondecode解析当前JSON得到的是对象类型而非列表,根节点下字段类型不统一:包含对象数组类型的c字段、单对象类型的l/m/n/s/ss/in/b字段,以及无id属性的字符串类型od字段,直接用[*]展开不符合数据结构逻辑
  • 根因2:原有逻辑仅遍历local.sections[0],既没有覆盖所有顶层节点,也没有处理数组类型字段、过滤无id属性的无效字段,自然无法拿到全量id值

正确实现代码

locals {
  # 解析JSON源文件,无需提前做展开操作
  raw_data = jsondecode(file("./data.json"))

  # 提取全量id值,自动兼容不同字段类型、过滤无id的无效字段
  all_ids = flatten([
    for _, val in local.raw_data : [
      # 字段值为列表/数组时,遍历内部元素取id;字段为带id属性的对象时直接取id;其余字段返回空列表跳过
      can(type(val), list) ? [for item in val : item.id] : (can(val.id) ? [val.id] : [])
    ]
  ])
}

output "ids" {
  value = local.all_ids
  type  = list(string)
}

实现逻辑说明

  • 遍历JSON根节点所有键值对时,不需要硬编码字段名,适配后续JSON字段增减的场景
  • 用can()函数做类型校验、属性存在性校验,避免因字段类型不匹配(比如字符串类型的od字段无id属性)触发运行报错
  • 用flatten()函数把嵌套的列表结构拍平为一维字符串列表,兼容c字段是数组的特殊结构
  • 输出块显式指定type = list(string)做类型约束,确保最终返回结果是符合要求的列表类型变量

运行后输出的ids结果为:["6", "7", "8", "5", "9", "1", "65", "2"],和JSON内所有id值完全匹配。


内容的提问来源于stack exchange,提问作者vrledu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 23:18:33