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

问题描述 投票:-1回答:2

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

我希望得到身份证明。

python bash shell curl
2个回答
1
投票

你正在迭代字典,所以在你的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编码的字符串。


2
投票

试试jq

$ jq ".server.volumes.\"0\".id" so.json
"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
© www.soinside.com 2019 - 2024. All rights reserved.