TypeError:字符串索引必须是来自cURL命令的JSON上的整数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TypeError:字符串索引必须是来自cURL命令的JSON上的整数相关的知识,希望对你有一定的参考价值。

我正在尝试使用cURL命令从API检索特定数据。

{  
   "server":{  
      "volumes":{  
         "0":{  
            "id":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
         }
      }
   }
}

我有这个cURL命令管道到Python脚本:

ID_VOLUME=$(curl -s https://URL/API -H "X-Auth-Token: TOKEN" | python -c "import sys, json, re; print [i['volumes']['0']['id'] for i in json.load(sys.stdin)['server']]")
echo "$ID_VOLUME"

为清楚起见,-c开关运行

import sys, json, re
print [i['volumes']['0']['id'] for i in json.load(sys.stdin)['server']]

我得到的错误:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
TypeError: string indices must be integers

我希望得到身份证明。

答案

你正在迭代字典,所以在你的for循环中:

[i['volumes']['0']['id'] for i in json.load(sys.stdin)['server']]

iserver字典中的一个关键字,它是一个字符串。由于'server'字典只有一个密钥,那就是'volumes'

您甚至不需要循环,只需直接访问嵌套值:

json.load(sys.stdin)['server']['volumes']['0']['id']

如果要迭代多个卷,则迭代result['server']['volumes']字典的值:

[vol['id'] for vol in json.load(sys.stdin)['server']['volumes'].values()]

您可能希望查看jq command-line tool而不是在管道中提取JSON数据:

... | jq -r '.server.volumes."0".id'

或者如果你想要所有的ID,而不仅仅是"0"

... | jq -r '.server.volumes[] | .id'

-r开关告诉jq将id输出为原始字符串而不是JSON编码的字符串。

另一答案

试试jq

$ jq ".server.volumes."0".id" so.json
"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

以上是关于TypeError:字符串索引必须是来自cURL命令的JSON上的整数的主要内容,如果未能解决你的问题,请参考以下文章

读取 JSON 字符串 | TypeError:字符串索引必须是整数

Python:TypeError:字符串索引必须是整数[关闭]

弹性搜索 | TypeError:字符串索引必须是整数

TypeError:字符串索引必须是整数 Python 2

为啥在尝试从 api 获取数据时出现此错误“TypeError:字符串索引必须是整数”?

TypeError:使用Python解析JSON时字符串索引必须是整数?