我有一个字符串,它是REST API的返回值(http://requesttracker.wikia.com/wiki/REST),并且使用冒号分隔的键/值对。
id: 123414
name: Peter
message: bla bla
bla bla
Run Code Online (Sandbox Code Playgroud)
如何将这个字符串解析为对象?我可以使用现有的python解析器吗?
这是我要解析的字符串:
'RT/3.8.8 200 Ok\n\nid: ticket/46863\nQueue: customer-test\nOwner: Nobody\nCreator: young.park\nSubject: testing\nStatus: new\nPriority: 0\nInitialPriority: 0\nFinalPriority: 0\nRequestors: superuser@meme.com\nCc:\nAdminCc:\nCreated: Mon Apr 25 15:50:27 2011\nStarts: Not set\nStarted: Not set\nDue: Not set\nResolved: Not set\nTold: Not set\nLastUpdated: Mon Apr 25 15:50:28 2011\nTimeEstimated: 0\nTimeWorked: 0\nTimeLeft: 0\nCF.{Severity}: \n\n'
Run Code Online (Sandbox Code Playgroud)
您确实需要说出哪种REST API并提供文档参考。
从表面上看,它看起来并不难:
# Look Ma, no imports!
>>> s = 'id: 1234\nname: Peter\nmessage: foo bar zot\nmsg2: tee:hee\n'
>>> dict(map(str.strip, line.split(':', 1)) for line in s.splitlines())
{'message': 'foo bar zot', 'msg2': 'tee:hee', 'id': '1234', 'name': 'Peter'}
Run Code Online (Sandbox Code Playgroud)
但是:(1)文档应该将您指向解析器(2)从来没有一个简单的示例看起来那么容易(见tee:hee上文);如果您决定自己动手,则应将上述单线分解为多个步骤,以便可以进行一些错误检查(例如,line.split()返回正好是2条)。
给出api参考后的更新:
乍一看,该网站提供了大量示例,而没有实际说明其格式。我建议您多看一眼。如果失败,请询问作者/维护者。
在给出实际示例输入之后,并在注释“我刚刚尝试过此操作并崩溃了”之后,更新2:
提供的代码是对第一个(模棱两可的)示例输入的响应,其中除最后一行外的所有行都包含冒号。它伴随着一个建议,即应该分批完成而不是单行代码,尤其要提到检查的结果split(':', 1)。您使用了什么代码?“坠毁”到底是什么意思?您是否尝试过自己解决问题所在并加以解决?
您提供了哪些数据?您期待已久的实际样本具有以冒号分隔的key:value行,其前面是标题行和空行,然后是空行。可以通过单线的微不足道的调整来幸福地忽略这些:
>>> print dict(map(str.strip, line.split(':', 1)) for line in s.splitlines()[2:-1])
{'Status': 'new', 'Resolved': 'Not set', 'CF.{Severity}': '',
'TimeLeft': '0', 'Creator': 'young.park', 'Cc': '', 'Starts': 'Not set',
'Created': 'Mon Apr 25 15:50:27 2011', 'Due': 'Not set',
'LastUpdated': 'Mon Apr 25 15:50:28 2011', 'Started': 'Not set',
'Priority': '0', 'Requestors': 'superuser@meme.com',
'AdminCc': '', 'Owner': 'Nobody', 'Told': 'Not set',
'TimeEstimated': '0', 'InitialPriority': '0', 'FinalPriority': '0',
'TimeWorked': '0', 'Subject': 'testing'}
>>>
Run Code Online (Sandbox Code Playgroud)
注1:上面的输出是手动编辑的,以避免水平滚动。
注意2:包括Created和LastUpdated条目(-:其值包含冒号 :-)
如果您不希望幸福地忽略事物,则可以先进行分割线,然后断言第一行包含类似预期标题的内容,第二行和最后一行为空。