首页 > 解决方案 > 如果存在新的子节点,如何使用 python 在每次迭代中附加到 JSON 中的子节点?

问题描述

样本

template = {
    "Table": [
        {
            "level": 2,
            "value": {
                "element Name": "",
                "add Row": "False",
                "cost Type": "",
                "flag": "flag",
                "cost": "",
                "actions": "True"
            },
            "RHS": {},
            "children": [
                {
                    "level": 3,
                    "value": {
                        "element Name": "",
                        "add Row": "False",
                        "cost Type": "",
                        "cost": "",
                        "actions": "True"
                    },
                    "RHS": {},
                    "children": []
                }
            ]
        }
    ]
}

考虑到上面的字典,我想附加到最后一个“孩子”,每次循环运行时,它都应该附加到上一次迭代中创建的孩子。循环1:“children”:{“level”:4,“value”:{“element Name”:“”,“add Row”:“False”,“cost Type”:“”,“cost”:“” ,“动作”:“真”},“右轴”:{},“儿童”:[] }


循环 2:

迭代 2 "children":{ "level": 5, "value": {"element Name": "", "add Row": "False", "cost Type": "", "cost": "", “动作”:“真”},“右轴”:{},“孩子”:[] }


等等。

我的代码是:

循环的 Python 代码

for _ in range(sublevels):
    number = number + 1
    child = {"level": sublevels + 2,
                     "value": {"element Name": "", "add Row": False,
                               "cost Type": "", "cost": "",
                               "actions": True}, "RHS": {}, "children": []}
    template['Table'][0]['children'].append(child)

输出:迭代后,JSON 应该如下所示

{
    "Table": [
        {
            "level": 2,
            "value": {
                "element Name": "",
                "add Row": "False",
                "cost Type": "",
                "flag": "flag",
                "cost": "",
                "actions": "True"
            },
            "RHS": {},
            "children": [
                {
                    "level": 3,
                    "value": {
                        "element Name": "",
                        "add Row": "False",
                        "cost Type": "",
                        "cost": "",
                        "actions": "True"
                    },
                    "RHS": {},
                    "children": [
                        [
                            {
                                "level": 4,
                                "value": {
                                    "element Name": "",
                                    "add Row": "False",
                                    "cost Type": "",
                                    "cost": "",
                                    "actions": "True"
                                },
                                "RHS": {},
                                "children": [
                                    [
                                        {
                                            "level": 5,
                                            "value": {
                                                "element Name": "",
                                                "add Row": "False",
                                                "cost Type": "",
                                                "cost": "",
                                                "actions": "True"
                                            },
                                            "RHS": {},
                                            "children": []
                                        }
                                    ]
                                ]
                            }
                        ]
                    ]
                }
            ]
        }
    ]
}

Iteration 1: template['Table'][0]['children']
Iteration 2: template['Table'][0]['children'][0]['children']
Iteration 3: template['Table'][0]['children'][0]['children'][0]['children']

标签: pythonjsonpython-3.x

解决方案


import json

template = {"Table": []}
sublevels = 5

for _ in range(sublevels):
    #number = number + 1
    child = {"level": _ + 2,
                     "value": {"element Name": "", "add Row": False,
                               "cost Type": "", "cost": "",
                               "actions": True}, "RHS": {}, "children": []}

    cur_path = "[0]['children']"*_

    if _ == 0:
        template['Table'].append(child)
    else:
        exec(f"template['Table']{cur_path}.append(child)")


print(json.dumps(template, indent = 2))

不是最漂亮的方式,您应该避免使用 exec,但我试图从 dict 调用 JSON 路径,但它不起作用,所以我使用了 exec。

这很好用并且可以嵌套它..

运行此代码得到的输出:

{
  "Table": [
    {
      "level": 2,
      "value": {
        "element Name": "",
        "add Row": false,
        "cost Type": "",
        "cost": "",
        "actions": true
      },
      "RHS": {},
      "children": [
        {
          "level": 3,
          "value": {
            "element Name": "",
            "add Row": false,
            "cost Type": "",
            "cost": "",
            "actions": true
          },
          "RHS": {},
          "children": [
            {
              "level": 4,
              "value": {
                "element Name": "",
                "add Row": false,
                "cost Type": "",
                "cost": "",
                "actions": true
              },
              "RHS": {},
              "children": [
                {
                  "level": 5,
                  "value": {
                    "element Name": "",
                    "add Row": false,
                    "cost Type": "",
                    "cost": "",
                    "actions": true
                  },
                  "RHS": {},
                  "children": [
                    {
                      "level": 6,
                      "value": {
                        "element Name": "",
                        "add Row": false,
                        "cost Type": "",
                        "cost": "",
                        "actions": true
                      },
                      "RHS": {},
                      "children": []
                    }
                  ]
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}

推荐阅读