我是Python的新手,如何将其转换为json字符串?我想在下面的输出(op)中获取commitMessage的第一行?提前谢谢
>>> op = subprocess.Popen('ssh -p 29999 server-name.com gerrit query --commit-message --format=JSON Ib3856dcf0826942787c3d5a076eb6888dae9k2be', shell=True, stdout=subprocess.PIPE, cwd='../').communicate()
>>>
>>> op
('{"project":"mtt/proprietary/fg","branch":"master","id":"Ib3856dcf0826942787c3d5a076eb6888dae9k2be","number":"1857599","subject":"store Gain","owner":{"name":"owner1","email":"one@mail.com","username":"user1"},"url":"https://server-name.com/1857599","commitMessage":"my commit message\\n\\nChange-Id: Ib949999d3f4d94299993d5a076eb681c4aaaa2be\\n","createdOn":1478281199,"lastUpdated":1478732989,"sortKey":"0041150d001ad179","open":false,"status":"MERGED"}\n{"type":"stats","rowCount":1,"runTimeMilliseconds":4}\n', None)
>>> js = json.loads(op)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/json/__init__.py", line 338, in loads
return _default_decoder.decode(s)
File "/usr/lib/python2.7/json/decoder.py", line 366, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
TypeError: expected string or buffer
答案 0 :(得分:4)
进程有两个标准输出流:stdout和stderr。一个用于常规输出,另一个用于错误。 communicate
返回一个包含两个元素的元组:第一个是stdout,第二个是stderr。你需要第一个:
json.loads(op[0])
答案 1 :(得分:1)
从子进程返回的//this would go instead of async.each(result[0].images...
let queryPromises = [];
for (let image in result[0].images){
// toArray returns Promise if no callback passed
let queryPromise = db.collection("images").find({_id : item}).toArray();
//query execution has not started yet, so loop is working fine
queryPromises.push(queryPromise);
}
queryPromises
// queries execution starts now
.then(arrayOfResults => {
// do stuff with your results here; results arrive all at once
console.log(arrayOfResults);
}, err => {
console.log(err)
});
变量不是字符串,它是2个元素的元组。
只需执行:op
来解析第一个元素,即您尝试解析的json字符串