Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 合并terraform v0.12中的词典列表_Json_Terraform - Fatal编程技术网

Json 合并terraform v0.12中的词典列表

Json 合并terraform v0.12中的词典列表,json,terraform,Json,Terraform,我想使用terraform执行以下操作: 我有两个JSON: 1.json: [ { "description": "description1", "url": "url1", "data": "data1" }, { "description": "description2", "url": "url2", "data":

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

我有两个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中的字典。也就是说,组合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"
  },
]