python - 如何迭代自定义对象的属性名称
问题描述
嗨,我的 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
解决方案
使用 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']
推荐阅读
- vue.js - 使用vue.js,如何正确处理vue-unmanaged dom元素
- redis - redis 快照位置未在配置中指定
- unity-container - 来自统一配置文件的 RegisterType
- c# - 如何在 Asp.Net MVC 中显示饼图?
- grails - 如何为 Spring Security SAML 插件生成 SP XML
- c# - iOS 上的 System.Drawing
- ruby - 在 FreeBSD 上安装 gosu
- r - 如何使用具有 3 个变量的函数修复 lapply
- javascript - 将字符串替换为循环中的数字
- excel - if语句在满足条件时不改变颜色