json - 合并 terraform v0.12 中的字典列表

标签 json terraform

我想使用 terraform 执行以下操作:

我有 2 个 JSON:

1.json:

[
    {
        "description": "description1",
        "url":         "url1",
        "data":        "data1"
    },
    {
        "description": "description2",
        "url":         "url2",
        "data":        "data2",
        "action":        "action2"
    },
    {
        "description": "description3",
        "url":         "url3",
        "data":        "data3"
    }
]

2.json:

[
    {  
        "description": "description1",
        "url":         "url1",
        "data":        "data1"
    },
    {
        "description": "description2_new",
        "url":         "url2",
        "data":        "data2_new"
    },
    {
        "description": "description4",
        "url":         "url4",
        "data":        "data4"
    }
]

我想将它们合并为一个。如果 url 键相同,第二个 JSON 中的字典应覆盖第一个 JSON 中的字典。 IE。组合 JSON 应如下所示:

[
    {
        "description": "description1",
        "url":         "url1",
        "data":        "data1"
    },
    {
        "description": "description2_new",
        "url":         "url2",
        "data":        "data2_new"
    },
    {
        "description": "description3",
        "url":         "url3",
        "data":        "data3"
    },
    {
        "description": "description4",
        "url":         "url4",
        "data":        "data4"
    }
]

使用 python 我可以轻松做到这一点:

import json
with open('1.json') as f:
  json1 = json.load(f)
with open('2.json') as f:
  json2 = json.load(f)


def list_to_dict(json_list):
    res_dict = {}
    for d in json_list:
        res_dict[d['url']] = d
    return res_dict

def merge_json(json1, json2):
    j1 = list_to_dict(json1)
    j2 = list_to_dict(json2)
    j1.update(j2)
    res_list = []
    for key in j1.keys():
        res_list.append(j1[key])
    return res_list


print(json.dumps(merge_json(json1, json2), indent=4))

如何使用 terraform 做到这一点?

最佳答案

使用 terraform 0.12.x

$ cat main.tf

locals {
  # read from files and turn into json
  list1 = jsondecode(file("1.json"))
  list2 = jsondecode(file("2.json"))
  # iterate over lists and turn url into a unique key
  dict1 = { for item in local.list1 : item.url => item }
  dict2 = { for item in local.list2 : item.url => item }
  # combine both dictionaries so values converge
  # only take its values
  merged = values(merge(local.dict1, local.dict2))
}

output "this" {
  value = local.merged
}
$ terraform apply

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

this = [
  {
    "data" = "data1"
    "description" = "description1"
    "url" = "url1"
  },
  {
    "data" = "data2_new"
    "description" = "description2_new"
    "url" = "url2"
  },
  {
    "data" = "data3"
    "description" = "description3"
    "url" = "url3"
  },
  {
    "data" = "data4"
    "description" = "description4"
    "url" = "url4"
  },
]

关于json - 合并 terraform v0.12 中的字典列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60537370/

相关文章:

java - 如何在 Jackson 的 ObjectMapper 上添加 Jdk8Module

javascript - 我应该如何并行执行 2 个或更多 json 调用?

javascript - 无论方法如何,Node 都不会记录 JSON 对象的内容

json - DevOps Pipeline 在将变量值作为 JSON 正文发送以使用 Terraform 部署 Azure 资源时更改时间格式

json - 使用 knockout.mapping 时,knockoutjs 抛出 "Unknown template value"

json - Node.js/Express/Mongoose - 如何发送 JSON 和对象 View ?

Terraform - 未在根模块中声明托管资源

amazon-web-services - 通过 jenkins 部署到 AWS 时出现 Terraform 版本错误?

amazon-web-services - 确定 Terraform 配置所需的最低 AWS 权限的最有效方法是什么?

amazon-web-services - 地形错误: Incorrect attribute value type for subnet_ids vpc modules