仅当特定密钥对值与 iterable 匹配时,才在 JSON 对象中获取多个 JSON 密钥对值
Get multiple JSON keypair values within a JSON object only if a specific keypair value matches iterable
我正在尝试从通过 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)
我认为这里的问题是我无法弄清楚如何“识别”json 与我列表中的项目“匹配”的对象,因为 json 对象是“扁平的”(即我的 json 文件中的 'device2' 没有 'name' 和 'os_name' 嵌套在它下面,这将允许我 dict.get('device2')然后检索嵌套数据)。
抱歉,如果我没有清楚地理解您的问题,但看起来您正在尝试从列表而不是 JSON 文件中读取值,因为您正在查看 i.get
key.get
,而 key
是实际包含信息的内容。
对于优化问题,我建议将您的设备列表转换为一组。然后,您可以遍历 JSON 数组并检查给定名称是否在集合中,而不是以其他方式进行。优点是集合可以 return 如果它们在 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)
我正在尝试从通过 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)
我认为这里的问题是我无法弄清楚如何“识别”json 与我列表中的项目“匹配”的对象,因为 json 对象是“扁平的”(即我的 json 文件中的 'device2' 没有 'name' 和 'os_name' 嵌套在它下面,这将允许我 dict.get('device2')然后检索嵌套数据)。
抱歉,如果我没有清楚地理解您的问题,但看起来您正在尝试从列表而不是 JSON 文件中读取值,因为您正在查看 i.get
key.get
,而 key
是实际包含信息的内容。
对于优化问题,我建议将您的设备列表转换为一组。然后,您可以遍历 JSON 数组并检查给定名称是否在集合中,而不是以其他方式进行。优点是集合可以 return 如果它们在 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)