TypeError: строковые индексы должны быть целыми числами в JSON из команды cURL - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь получить определенные данные из API с помощью команды cURL.

{  
   "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

Я ожидаю получить идентификатор.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Вы перебираете словарь , поэтому в цикле 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-line Tool вместо извлечения данных JSON в конвейер:

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

или, если вам нужны все идентификаторы, а не только для "0":

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

Переключатель -r указывает jq выводить идентификатор в виде необработанной строки, а не строки в кодировке JSON.

0 голосов
/ 12 февраля 2019

Попробуйте jq:

$ jq ".server.volumes.\"0\".id" so.json
"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...