我有一个curl命令,它返回一些json结果。
{
"all":[
{
"id":"1",
"actions":[
"power",
"reboot"
]
},
{
"id":"2",
"actions":[
"shutdown"
]
},
{
"id":"3",
"actions":[
"backup"
]
}
]
}
我使用以下命令检索数据操作:
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']]"
但是我想在命令行的python中使用此代码:
for i in json.load(sys.stdin)['all']:
if i['id'] == '1':
print(i['actions'])
我尝试过这个:
curl -s https://DOMAIN/API -H "X-Auth-Token: TOKEN" | python -c "import sys, json, re; print [ if i['id'] == '1': i['actions'] for i in json.load(sys.stdin)['servers']]"
但是它返回语法错误
File "<string>", line 1
import sys, json, re; for i in json.load(sys.stdin)['all']:\nif i['id'] == '1':\nprint(i['actions'])
^
SyntaxError: invalid syntax
答案 0 :(得分:6)
您要打印此表达式:
list = [{ "name": "own", id: "own"},{ "name": "competitor", id: "competitor"}];
selectedRadio =this.list[0].id;
这将过滤[i['actions'] for i in json.load(sys.stdin)['all'] if i['id'] == '1']
所在的子词典,并使用id == 1
数据构建一个列表。
因此适用于curl命令行:
actions
使用简单的python命令行即可:
curl -s https://DOMAIN/API -H "X-Auth-Token: TOKEN" | python -c "import sys, json, re; print([i['actions'] for i in json.load(sys.stdin)['all'] if i['id'] == '1'])"
id似乎是唯一的,所以最好避免返回包含1个元素的列表:
[['power', 'reboot']]
使用该表达式将产生next((i['actions'] for i in json.load(sys.stdin)['all'] if i['id'] == '1'),None)
或['power', 'reboot']
(如果找不到)
答案 1 :(得分:3)
尝试jq。这是一个轻巧灵活的命令行JSON解析器,并且是Ubuntu(apt install jq
)和Red Hat(yum install jq
)中的标准软件包。
$ curl ... | jq -c '.all[] | select(.id=="1").actions'
["power","reboot"]
它可以与JSON和标准UNIX工具一起使用。如果要将输出提供给常规工具,请使用-r
:
$ curl ... | jq -r '.all[] | select(.id=="1").actions[]'
power
reboot