【问题标题】:Loop through JSON data in Python在 Python 中循环遍历 JSON 数据
【发布时间】:2018-04-25 22:34:58
【问题描述】:

我还是 Python 新手,此时我正在试验 GET 请求,只显示来自一个特定字符串的值。

import requests
import json

response = requests.get("APIURL")
data = response.text
parsed = json.loads(data)
id = parsed["products"][0]["id"]
print(id)

正如您在上面的代码中看到的,我还没有 for 循环,已经尝试了不同的方法,但仍然无法正常工作。使用上面的代码,我只得到第一个产品的“id”,其他产品我没有得到结果。

从 JSON 加载的 dict 的打印输出如下所示:

{
    products: [
        {
            id: 66057248,
            createdAt: "2018-02-28T14:55:22+01:00",
            updatedAt: "2018-02-28T14:55:22+01:00",
            isVisible: true,
            visibility: "visible",
            hasMatrix: false
        }
    ]
}

【问题讨论】:

    标签: python json api parsing for-loop


    【解决方案1】:

    你可以这样做:

    for product in parsed:
        for index in parsed[product]:
            for element in parsed[product][index]:
                print(element.id)
                print(element.createdAt)
                # ...
    

    在 Simon 的回答中,循环中的 id 值实际上是 'id''createdAt' 等。要仅打印 id,因为它表明您需要断言密钥是否等于 'id',这使得循环没用。

    注意:不建议使用id 作为变量名。它是一个保留字,在这种情况下,您可以添加下划线来代替id_

    【讨论】:

    • 我必须更改哪些值才能将其与现有代码合并,我必须从现有代码中删除哪些值?
    • 如果我的问题是正确的,如果您更改此for 的最后两行,它将为parsed 字典中每个产品的每个元素打印每个idcreatedAt
    【解决方案2】:

    diek 的解决方案对我有用,因此编辑了我的帖子。更好的代码是:

    import requests
    import json
    response = requests.get("")
    data =response.text
    parsed=json.loads(data)
    
    for product in parsed['products']:
        print(product['id'])
    

    输出将如下所示:

    66057248
    66057245
    66057242
    66057239
    66057236
    66057233
    66057230
    66057227
    66057224
    

    【讨论】:

    • 在您的示例中给出一项尚不清楚。如果结构是 'products': [ {'id': 66057248}, {'id': 66057245},....],则绝对不需要使用 range 和 len
    • 如果你的 json 格式是这样的,dpaste.de/RUzV 那么你只需要,dpaste.de/5gc2
    • 首先,Python 比其他语言更容易进行迭代。您不必考虑长度,Python 管理它。如果您想更好地理解它,请观看 Ned Batchelder 的 PyCon 视频 Loop Like a Native。 29 分钟用得很好
    • 其次,当我有数据['products']时,我有一个字典列表。不需要索引。然后,我使用字典键“id”来访问每次迭代的值/数据。在更复杂的结构中,您可能需要使用索引来深入了解
    • 非常感谢@diek 提供的信息和视频,非常感谢!如您所见,我已经在上面编辑了我的答案:)
    【解决方案3】:

    Json 使用字典,因此您可以使用 keys() 获取所有可能的值,然后遍历它们:

    for id in parsed["products"][0].keys():
        print(parsed["products"][0][id])
    

    想通了:

    这不是 json。它是 YAML(因为您的代码缺少 "(语音标记))。你需要一个 YAML 解析器来运行它。一旦你有了,它就会正常运行。

    【讨论】:

    • 嗨,我试过你的代码,也许我做错了什么但我的输出如下所示:66057248 66057248 66057248 66057248 66057248 66057248 正如你所看到的,它不断循环第一个产品并没有获取其他产品的 ID。
    • @Solaiman 如果您按照以下建议更改id 的值会发生什么?你得到同样的结果吗?
    • 是的,忘了提一下,我已经按照下面的建议更改了 id 的值。所以是的,结果相同。
    • 感谢您的帮助@Simon,我设法解决了。它是 json :P,无论如何下面的代码都有效: import requests import json response = requests.get("") data =response.text parsed=json.loads(data) for i in range(0,len(parsed[ "products"])): print(parsed["products"][i]["id"])
    • 您可以编写自己的答案并接受,而不是接受我的答案。您的解决方案似乎与我的很多不同。 @Solaiman
    猜你喜欢
    • 2020-04-14
    • 2018-06-19
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多