Как получить значение из json, зная указанный идентификатор в команде cURL - PullRequest
0 голосов
/ 06 февраля 2019

Моя команда cURL возвращает мне некоторые данные json, такие как:

{  
    "all":[  
        {
            "id":"1",
            "actions":[  
                "power",
                "reboot"
            ]
        },
        {
            "id":"2",
            "actions":[  
                "shutdown"
            ]
        },
        {
            "id":"3",
            "actions":[  
                "backup"
            ]
        }
    ]
} 

Зная только id, как я могу вернуть значения actions в переменную?Я знаю, как анализировать идентификаторы, но как я могу получить actions?

Вот команда cURL:

#!/bin/bash
IDS=$(curl https://DOMAIN/API -H "X-Auth-Token: $TOKEN" | python -c "import sys, json; print [i['id'] for i in json.load(sys.stdin)['all']]")

$IDS выведет все IDS из json.


Пример: Если я ищу id = 1, я получу ["power", "reboot"]


Я также могу получить действия с:

#!/bin/bash
ACTIONS=$(curl -s https://DOMAIN/API -H "X-Auth-Token: TOKEN" | python -c "import sys, json, re; print [ i['allowed_actions'] for i in json.load(sys.stdin)['servers']]")

Я думал, что делаю что-то вроде этого:

#!/bin/bash
ACTIONS=$(curl -s https://DOMAIN/API -H "X-Auth-Token: TOKEN" | python -c "import sys, json, re; print [ if i['id'] == '1': i['allowed_actions'] for i in json.load(sys.stdin)['servers']]")

Но у меня есть синтаксическая ошибка.

Как я могу перевести этот код в один код командной строки?

for i in json.load(sys.stdin)['all']:
    if i['id'] == '1':
        print(i['actions'])

Ответы [ 2 ]

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

С CLI вы можете использовать jq;

curl -s "http://api.icndb.com/jokes/random" | jq '.value.joke'

В вашем случае это может быть что-то вроде (не проверено):

ACTIONS=$(curl -s "https://DOMAIN/API" | jq '.all.actions')

Дополнительная информация/ примеры для jq;

https://medium.com/cameron-nokes/working-with-json-in-bash-using-jq-13d76d307c4

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

Обычно нормой является не использовать exec в python, но так как вы хотели быть в одной строке, здесь вы идете

cat temp | python -c "exec(\"import sys,json \nfor i in json.load(sys.stdin)['all']:\n    if i['id'] == '1':\n        print(i['actions'])\")"

Говоря это, я предлагаю просто создать еще один файл python и позволить этой работе бытьсделано этим файлом, надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...