【问题标题】:Iterate and update json values with python使用python迭代和更新json值
【发布时间】:2018-08-07 18:16:57
【问题描述】:

我有以下 json:

{
  "taskDefinition": {
    "containerDefinitions": [
      {
        "memoryReservation": 1040,
        "mountPoints": [

        ],
        "name": "staging-web1",
        "image": "1234567.dkr.ecr.us-west-2.amazonaws.com\/staging:staging-web",
        "essential": true,
        "environment": [
          {
            "name": "REVISION",
            "value": ""
          },
          {
            "name": "RELEASE_VERSION",
            "value": ""
          },
          {
            "name": "ENVIRONMENT",
            "value": ""
          }
        ],
        "logConfiguration": {
          "logDriver": "awslogs",
          "options": {
            "awslogs-region": "us-west-2",
            "awslogs-group": "\/ecs\/staging",
            "awslogs-stream-prefix": "ecs"
          }
        },
        "portMappings": [

        ],
        "cpu": 0,
        "volumesFrom": [

        ]
      },
      {
        "memoryReservation": 1040,
        "mountPoints": [

        ],
        "name": "s-staging-nosql1",
        "image": "1234567.dkr.ecr.us-west-2.amazonaws.com\/staging:staging-nosql",
        "essential": true,
        "environment": [
          {
            "name": "REVISION",
            "value": ""
          },
          {
            "name": "RELEASE_VERSION",
            "value": ""
          },
          {
            "name": "ENVIRONMENT",
            "value": ""
          }  
        ],
        "logConfiguration": {
          "logDriver": "awslogs",
          "options": {
            "awslogs-region": "us-west-2",
            "awslogs-group": "\/ecs\/staging",
            "awslogs-stream-prefix": "ecs"
          }
        },
        "portMappings": [

        ],
        "cpu": 0,
        "volumesFrom": [

        ]
      },
      {
        "memoryReservation": 1040,
        "mountPoints": [

        ],
        "name": "s-staging-db1",
        "image": "1234567.dkr.ecr.us-west-2.amazonaws.com\/staging:staging-db",
        "essential": true,
        "environment": [
          {
            "name": "REVISION",
            "value": ""
          },
          {
            "name": "RELEASE_VERSION",
            "value": ""
          },
          {
            "name": "ENVIRONMENT",
            "value": ""
          }  
        ],
        "logConfiguration": {
          "logDriver": "awslogs",
          "options": {
            "awslogs-region": "us-west-2",
            "awslogs-group": "\/ecs\/staging",
            "awslogs-stream-prefix": "ecs"
          }
        },
        "portMappings": [

        ],
        "cpu": 0,
        "volumesFrom": [

        ]
      }
    ]
  }
}

我尝试用python做的是在containerDefinitions中调整每个环境下的REVISION、RELEASE_VERSION和ENVIRONMENT。

在python方面我是个新手,但我正在尝试如下:

NEW_CONTAINER_DEF=$(echo "${PREVIOUS_TASK_DEF}" | python <(cat <<-EOF
import sys, json
json_data = json.load(sys.stdin)
for item in json_data['taskDefinition']['containerDefinitions']:
    if json_data.get(['environment']['name'])  == "REVISION":
         item['environment']['value']  = "myrevision"
print json.dumps(json_data)
EOF
))

不用说上面的代码不起作用。有更多 python 经验的人可以帮助我了解如何迭代和更新值吗?

谢谢!

【问题讨论】:

    标签: python json for-loop


    【解决方案1】:

    请注意,调用json.load 只是将the json 序列化为python dictionary。您可以相应地修改该字典。

    看来首先您想遍历所有taskDefinition.containerDefinitions,然后您想遍历这些定义中的所有environments,并设置环境value,如果环境nameREVISION .看到这个:

    for item in json_data["taskDefinition"]["containerDefinitions"]:
        for env in item["environment"]:
             if env["name"] == "REVISION":
                 env["value"] = "myrevision"
    print json.dumps(json_data, indent=4)
    

    【讨论】:

    • 太棒了。我一直在努力尝试各种排列以使其发挥作用。我有其他语言的编程经验,但我是 python 新手,所以我不知道我哪里出错了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    • 2021-08-26
    • 2019-05-12
    • 2023-04-03
    • 2022-11-19
    相关资源
    最近更新 更多