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']]
i
是server
字典中的一个关键字,它是一个字符串。由于'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:字符串索引必须是整数[关闭]