我正在尝试使用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"