使用python从JSON中提取多重嵌套数据

问题描述 投票:0回答:1

我看到了关于这个主题的其他几个问题,但即使如此,我也无法解决这个特定案例中的问题。

在 json 文件中,我试图从嵌套列表中获取某个整数,向其中添加另一个(固定)整数,然后将修改后的整数写回到 json 文件中。 我尝试修改的整数位于 json 的嵌套列表中,如下所示: [头] -->'生物列表' -------->value [此列表中未命名的多个条目,每个条目都括在一对大括号内] ------------>'FactionID' ---------------------->'值:'

我想修改“FactionID”“value”整数(向其添加固定整数)并将结果写回到json文件中。

有一个充满 json 文件的目录,我正在尝试执行此操作。

我的 json 看起来像这样(我已经把它删减了很多,但希望它仍然可以解析):

`{
  "__data_type": "GIT ",
  "AreaProperties": {
    "__struct_id": 100,
    "type": "struct",
    "value": {      
    }
  },
  "Creature List": {
    "type": "list",
    "value": [
      {
        "__struct_id": 4,
        "Appearance_Type": {
          "type": "word",
          "value": 242
        },        
        "FactionID": {
          "type": "word",
          "value": 2
        },
      }
   }
}

我无法访问 ['Creature List']['value'] 中的子项。其中可能有几个不同的子列表。在我看来,由于 ['Creature List']['value'] 下的子列表没有整数或字符串名称来标识条目,因此可能存在问题?但我无法编辑 json 来解决这个问题。

这是我现在用于测试目的的代码:

  for filename in os.listdir(directory):
    if filename.endswith('.git.json'):
      file_path = os.path.join(directory, filename) 

      try:
        with open(file_path, 'r') as f:
          data = json.load(f)

        for key, value in data.items():
          if key == 'Creature List' and isinstance(value, dict) and 'value' in value:                        
            for creature in value:
              if 'FactionID' in creature:
                 creature['FactionID']['value'] += 46
                 print(filename)
                 print(creature)
                 print(creature['FactionID']['value']
                
                 with open(file_path, 'w') as f:
                    json.dump(data, f, indent=4)
                    print(f"Modified {filename}")
      except (json.JSONDecodeError, FileNotFoundError) as e:
        print(f"Error processing {filename}: {e}")              

我尝试使用例如获取 FactionID“值”整数print(data['Creature List']['value']['FactionID']['value']),但这会引发错误。

我对 python 没有太多经验,感谢任何帮助。谢谢

python json nested
1个回答
0
投票

首先,不需要迭代 json 数据中的所有顶级键,因为您专门寻找

"Creature List"
键。

直接访问即可,如下所示:

data["Creature List"]

在其中,您知道您正在寻找

"value"
键,因此您也可以直接访问该键:

data["Creature List"]["data"]

这是一个项目列表,因此您需要对其进行迭代:

for item in data["Creature List"]["data"]:

然后对于你找到的每一项,你想要添加一个固定的整数到

["FactionID"]["value"]

所以把它们放在一起,我想这就是你想要的:

for item in data["Creature List"]["data"]:
    item["FactionID"]["value"] += 7
© www.soinside.com 2019 - 2024. All rights reserved.