【问题标题】:How to access data from nested dicts json?如何从嵌套的 dicts json 访问数据?
【发布时间】:2020-09-15 20:14:55
【问题描述】:

我想从 json 文件中获取一些数据。我可以使用下面的代码访问所有内容。

import json
    
with open('C:\\Users\\me\\Documents\\stdin.json', 'r', encoding='utf8', errors='ignore') as json_file:
data = json.load(json_file)
    
    
    print("Type: ", type(data))
    print("VM: ", data["Datacenter"])

.json 文件如下所示:

{
   "Datacenter":[
      {
         "Folder":[
            {
               "Folder":[
                  {
                     "VirtualMachine":[
                        {
                           "moid":"vm-239566",
                           "name":"DEV CentOS 6",   
                        },
                        {
                           "moid":"vm-239464",
                           "name":"DEV Sles 12",
                        },
                     ],
                     "moid":"group-v239127",
                     "name":"DEV-VMs"
                  },
               ],
               "moid":"group-v78",
               "name":"Test and Dev"
            },
            {
               "VirtualMachine":[
                  {
                     "moid":"vm-66130",
                     "name":"Hyv16-clone",
                  }
               ],
               "moid":"group-v77",
               "name":"Templates"
            }
         ],
         "moid":"datacenter-21",
         "name":"Datencenter"
      }
   ],
   "vSphereHost":"srv01",
   "vSphereProductLine":"vpx",
   "vSphereServer":"VMware vCenter Server",
   "vSphereVersion":"xxx",
   "version":"1.0",
   "viewType":"VMs and Templates"
}

请注意,原始 json 文件要大得多,因为我删除了行以提高可读性。另请注意,我从命令行运行所有内容,因为我的 IDE 总是给我错误UnicodeEncodeError: 'charmap' codec can't encode characters in position 22910-22912: character maps to <undefined>

我尝试使用data["VirtualMachine"] 而不是data["Datacenter"],但随后出现错误...TypeError: 'VirtualMachine' is an invalid keyword argument for this function. 那么如何获取/打印 VM 的模式和名称?我真的是编码新手,不知道如何处理嵌套字典

【问题讨论】:

  • 一个问题是你有嵌套对象在不同的​​地方使用相同的键(VirtualMachine),这会导致答案冲突。因此,您可能需要澄清您希望 moidname 来自哪个对象,以便任何人给出单一答案。
  • VirtualMachineFolder 的一部分,Folderanother 的一部分,FolderDataCenter 的一部分。因此,您需要一次向下钻取一层。
  • 另外,其中一些是数组,其元素由它们的位置来标识,而不是由名称(它们没有)。
  • some_dict[key]some_list[index];链适当。只有在应用基本访问不包含结果和/或检查变得混乱之后,问题才会变得有些有趣。
  • FWIW:该错误不应来自呈现的代码。再次验证并更新问题。

标签: json python-3.x dictionary nested


【解决方案1】:

但是,您的问题似乎并不清楚,但是从您提到的任何内容来看,如果您已经创建了数据框,这可以帮助您推导出嵌套 json 中的值。您可以继续添加get(),直到达到您的要求。以下是您可以使用的示例

import json
data = data.apply(lambda x: json.loads(json.loads(x).get("Folder","{}")).get("moid") if x else None)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 2021-04-21
    相关资源
    最近更新 更多