【发布时间】:2018-10-17 18:18:00
【问题描述】:
我有来自 curl 命令的 json 输出,我想在其中获取一个值,但不知道该怎么做。我正在尝试获取“X-Subject-Token”,如下所示。
阅读我发现我可以使用json.load(sys.stdin)['X-Subject-Token']' 的类似答案。我尝试运行下面的sn-p...
$ curl -v -s -X POST https://host.com:13000/v3/auth/tokens?nocatalog \
-H "Content-Type: application/json"
-d '{\
"auth": {\
"identity": {\
"methods": [\
"password"\
],\
"password": {\
"user": {\
"domain": {\
"name": "'"$OS_USER_DOMAIN_NAME"'"\
},\
"name": "'"$OS_USERNAME"'",\
"password": "'"$OS_PASSWORD"'"\
}\
}\
},\
"scope": {\
"project": {\
"domain": {\
"name": "'"$OS_PROJECT_DOMAIN_NAME"'"\
},\
"name": "'"admin"'"\
}\
}\
}\
}' | \
python -m json.tool | \
python -c 'import sys, json; print json.load(sys.stdin)['X-Subject-Token']'
...这给了我以下错误:
File "<string>", line 1, in <module>
KeyError: 'X-Subject-Token'
试图用双引号代替单引号...
print json.load(sys.stdin)["X-Subject-Token"]'
...得到一个不同的错误:
NameError: name 'X' is not defined.
这是我试图从中提取的输出的 sn-p:
> Accept: */*
> Content-Type: application/json
> Content-Length: 245
>
} [data not shown]
* upload completely sent off: 245 out of 245 bytes
< HTTP/1.1 201 Created
< X-Subject-Token: xxxxxxxxxxxxxxxxxxxxxxx
< Vary: X-Auth-Token
< Content-Type: application/json
< Content-Length: 489
我怎样才能得到X-Subject-Token?
我也尝试过 grep 和 awk,我有更多经验,但 Python 似乎是最干净的。
【问题讨论】:
-
可以显示 JSON 数据吗?
-
您知道
X-Subject-Token是响应标头而不是任何JSON 的一部分吗? -
您显示的数据不是有效的 JSON。
python -n json.tool的输出是什么? -
为什么不用
pythonrequests库在 Python 中完成这一切?这样,您就可以访问返回的内容以及所有 HTTP 标头等。 -
@jwodder @scnerd 我在这里尝试学习的几个领域。主要是 OpenStack 和 API,所以我偶然发现了 Python 示例并使用了它。我会寻找
python requests的例子,看看我能不能解决它。感谢您的回复。