解析json输出字符串

时间:2016-11-16 17:35:10

标签: python json

我是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

2 个答案:

答案 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字符串