首页 > 解决方案 > 如何迭代自定义对象的属性名称

问题描述

嗨,我的 python 代码中有一个 JSON 对象,我将它们用作我的代码中的对象。它的类型是 JSONHelper.X,这是我编写的一个自定义类,它读取一个 json 文件并将其转换为一个对象以便于使用。

{
   "Gui":{
      "Images":{
         "Logo1":"url1",
         "Logo2":"url2",
         "Logo3":"url3",
         "Logo4":"url4",
         "Logo5":"url5"
      }
   }
}

如何从该对象中检索一对属性名称和值以将另一个类作为参数。JSONHelper 对象似乎没有dict属性,所以我不能说 Gui.Images.keys()。当我打印 Gui.Images 时,我只得到值。

我可以达到如下属性名称。有没有更好的方法来做到这一点?

    def prop_names(self):
            l = []
            public_props = (name for name in dir(self.settings.Images) if not name.startswith('_'))
            for name in public_props:
                if name is not "count" and name is not "index":
                    print(name)
            print(l
)
output: 
Logo1
Logo2
Logo3
Logo4
Logo5

标签: python

解决方案


使用 json.load 将您的 JSON 辅助字符串转换为字典(请参阅 Barmar 的评论)。从那里您可以访问所需的键值。

import json
import itertools

j="""{
   "Gui":{
      "Images":{
         "Logo1":"url1",
         "Logo2":"url2",
         "Logo3":"url3",
         "Logo4":"url4",
         "Logo5":"url5"
      }
   }
}""" 
d = json.loads(j)
l = [list(d[k1][k2].keys()) for k1 in d.keys() for k2 in d[k1].keys()]
print(list(itertools.chain.from_iterable(l)))

结果:

['Logo1', 'Logo2', 'Logo3', 'Logo4', 'Logo5']

推荐阅读