request({
url: "https://xx.xxx.xxx.xxx:9999/run",
headers: {
'Accept': 'application/x-yaml',
'X-Auth-Token': "41b9539436faae8016c305c2f875b31e47a23d93",
'Content-type': 'application/json',
},
method: "POST",
json: true,
body: [{
"client": "local",
"tgt": "master_minion",
"fun": "cmd.script",
"kwarg": {"source": "salt://update-diff.py", "args":args},
"username": "salt",
"password": "salt",
"eauth": "pam"
}]
}
我正在向salt-api发送请求以运行脚本。我需要解析输出。
示例输出:
return:
- master_minion:
pid: 28796
retcode: 0
stderr: ''
stdout: " sadfh,smfsdhg\n sfgmsfgmsg\n sfgmsfgmsg\n-dkfadnfklad--->New123\n+dkfadnfklad--->New1232\n\
\ sdfjhs,dfhn\n sdfjhs,dfhn\n sdfjhs,dfhn"
我可以在JSON中获得这些输出吗?
我想要如下所示的数组中的所有行:
预期输出 [" sadfh,smfsdhg"" sfgmsfgmsg"" sfgmsfgmsg"" -dkfadnfklad ---> New123"&#34 + dkfadnfklad ---> New1232"" sdfjhs,dfhn"" sdfjhs,dfhn"" sdfjhs,dfhn"]
有什么建议吗?在此先感谢
答案 0 :(得分:1)
要从salt-api返回JSON,您只需更改请求标头中的Accept-type:
struct foo {
foo() : baz(foobar) {}
enum bar {foobar, fbar, foob};
bar baz;
};
void f() {
for( auto x : { foo::foobar,
foo::fbar,
foo::
foo::
foo::foob } );
// ...
}
然后你会得到类似的东西:
request({
url: "https://xx.xxx.xxx.xxx:9999/run",
headers: {
'Accept': 'application/json',
...
根据您的预期输出,我认为这不是您想要的。但是您的预期输出不是JSON。 JSON是一个基于键值的数据结构,就像python字典一样。你期待像列表一样的东西。您期望的列表可以是JSON的一部分,但需要一个密钥:
{
"return": [
{
"master_minion": {
"pid": 28796,
"retcode": 0,
"stderr": "",
"stdout": " sadfh,smfsdhg\n sfgmsfgmsg\n sfgmsfgmsg\n-dkfadnfklad--->New123\n +dkfadn--->New1232\n sdfjhs,dfhn\n sdfjhs,dfhn\n sdfjhs,dfhn"
}
}
]
}
salt-api无法将执行脚本的stdout从任意字符串格式化为JSON(如何知道\ n是列表项的标记)。您需要通过将update-diff.py脚本中的输出格式化为json(在脚本中)来自行完成。即便如此,你只会在其中获得一个带有JSON的字符串,但是你可以轻松地提取它并继续处理。