仅当特定密钥对值与可迭代匹配时,才在 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 密钥对值的主要内容,如果未能解决你的问题,请参考以下文章

从 JSON 响应中提取浮点密钥对值时出现 TypeError

MongoDb 仅当数组不为空时才在数组中添加字段

如何在 BigQuery 中解析 JSON 密钥对值?

仅当它不存在时才在 SQLite 中创建表

仅当行已更改时,MySQL 才在更新后触发

仅当所有文本字段都已填写时才在 Swift 中启用按钮