json 尝试理解“TypeError:列表索引必须是整数或切片,而不是str”错误消息

2exbekwf  于 2023-03-31  发布在  其他
关注(0)|答案(1)|浏览(95)
### This line works fine
health_data_json = resp.json()["data"]["metrics"]

### This line produces "TypeError: list indices must be integers or slices, not str" 
energy_data_json = resp.json()["data"]["metrics"]["basal_energy_burned"]

### This line works fine
steps_data_json = resp.json()["data"]["metrics"][1]

### Also works fine
steps_data_json2 = resp.json()["data"]["metrics"][1]["data"]

我试图更好地理解如何在Python中正确地访问数据,发现我有时会收到错误消息,与其他看起来相似/相同但不产生错误的代码行相比,我真的不明白为什么。我提供了上面的一些代码片段来读取JSON文件。在第一行中,我可以使用两次字段名称来返回JSON的特定部分。
但是当我尝试进入第三层时,我就不能再这样做了,必须使用整数索引来提取数据。然后我再次能够在第四层成功地使用name字段来检索JSON的另一部分。
为什么会出现这种情况,避免/防止这种情况的最佳方法是什么?

编辑:

感谢到目前为止所有有用的评论,我想分享JSON的一个片段,以寻求更好的方式访问数据的建议,而不是在格式发生变化的情况下通过数字索引,有没有一种方法可以利用这里显示的名称字段:

{
  "data" : {
    "metrics" : [
      {
        "units" : "kcal",
        "name" : "basal_energy_burned",
        "data" : [
          {
            "date" : "2022-01-01 00:00:00 -0800",
            "source" : null,
            "qty" : 2254.3233141492697
          },
yyyllmsg

yyyllmsg1#

resp.json()["data"]["metrics"]是一个列表。因此,不能将索引["basal_energy_burned"]应用于它。必须使用像[1]这样的数字索引。
我认为这里真实的的问题是为什么你 * 期望 * 它是其他的。是的,第一和第二级别的项目是字典,但那又怎样?网站可以自由地以任何格式返回响应。

相关问题