仅当特定密钥对值与可迭代匹配时,才在 JSON 对象中获取多个 JSON 密钥对值
Posted
技术标签:
【中文标题】仅当特定密钥对值与可迭代匹配时,才在 JSON 对象中获取多个 JSON 密钥对值【英文标题】:Get multiple JSON keypair values within a JSON object only if a specific keypair value matches iterable 【发布时间】:2019-12-20 14:40:25 【问题描述】:我正在尝试从通过 API 调用生成的 JSON 文件中提取任何给定 JSON 对象中的多个 json 键值数据,仅用于在键值对中包含特定值的 JSON 对象;键值对中的这个特定值是通过迭代列表获得的。很难说清楚,所以让我告诉你:
这是一个列表(代表我的真实列表的假列表),其中包含我感兴趣的“键值对中的特定值”:
mylist = ['device1', 'device2', 'device3']
这是我从我的 python 脚本中读取的 json 文件(显然是显着删节的):
[
"name": "device12345",
"type": "other",
"os_name": "Microsoft Windows 10 Enterprise",
"os_version": null
,
"name": "device2",
"type": "other",
"os_name": "Linux",
"os_version": null
,
"name": "device67890",
"type": "virtual",
"os_name": "Microsoft Windows Server 2012 R2 Standard",
"os_version": null
]
我想遍历 mylist,并且对于 mylist 中与 json 文件中的 json 键值键“name”匹配的每个项目,打印“name”和“os_name”的值。在这种情况下,我应该看到一个结果,在遍历 mylist 之后,device2 匹配包含 'name':'device2' 的 json 对象中的 'name' 键,然后同时打印 'name' 值('device2 ') 和 'os_name' 值 ('Linux'),然后继续遍历 mylist 以获取下一个值以遍历 json 文件。
我的代码不起作用;让我们假设 json 文件已在 python 中正确打开,并被定义为 my_json_file,类型为 List:
for i in mylist:
for key in my_json_file:
if key == i:
deviceName = i.get('name')
deviceOS = i.get('os_name')
print(deviceName)
print(deviceOS)
我认为这里的问题是我无法弄清楚如何“识别”与 mylist 中的项目“匹配”的 json 对象,因为 json 对象是“扁平的”(即我的 json 文件中的 'device2' 'name' 和 'os_name' 嵌套在它下面,这将允许我 dict.get('device2') 然后检索嵌套数据)。
【问题讨论】:
【参考方案1】:抱歉,如果我没有清楚地理解您的问题,但您似乎正在尝试从列表中读取值而不是 JSON 文件,因为您在 key
时查看的是 i.get
而不是 key.get
是实际包含信息的内容。
对于优化问题,我建议您将设备列表转换为一组。然后,您可以遍历 JSON 数组并检查给定名称是否在集合中,而不是以其他方式进行。优点是如果集合在O(1)
时间包含一个项目,则可以返回,这意味着它将显着加快程序的整体速度到O(n) where n = size of json array
。
for key in my_json_file:
if key.get('name') in my_list:
deviceName = key.get('name')
deviceOS = key.get('os_name')
print(deviceName)
print(deviceOS)
【讨论】:
没有意识到我可以对 if x in y 使用“in”逻辑...这有效。我认为要使这个“优化”,我需要做的唯一改变就是简单地将 if 语句设置为“if key.get('name') in set(my_list)”,是吗? 没错,但由于条件是循环的,转换可能会发生多次。因此,如果可以的话,最好事先将其转换为集合。以上是关于仅当特定密钥对值与可迭代匹配时,才在 JSON 对象中获取多个 JSON 密钥对值的主要内容,如果未能解决你的问题,请参考以下文章