套接字接收一个JSON格式的字符串,并且可能会收到多个,这将导致变量包含这样的内容:
{'a':'1','b':'44'}{'a':'1','b':'44'}
如您所见,一个变量中有多个JSON字符串。如何在Python中解码这些?
我的意思是,Python中有没有办法将两个JSON字符串解码为一个数组,或者只是一种知道输出中可能有两个字符串的方法?
使用新行拆分它们不是一个好主意,因为数据实际上可能有新行。
答案 0 :(得分:1)
您可以使用标准JSON解析器,并在适当的JSON字符串后面有额外数据时使用它抛出的描述性异常。
目前(也就是我的JSON解析器版本)会抛出ValueError
,其中的消息如下所示:"Extra data: line 3 column 1 - line 3 column 6 (char 5 - 10)"
。
在这种情况下,数字5
(您可以使用regular expression轻松地从消息中解析出来)提供 解析失败的信息。因此,如果你得到了这个异常,你可以解析原始输入的子字符串,即之前的字符之前的所有字符串,之后(我建议递归地)解析其余部分。
import json, re
def jsonMultiParse(s):
try:
return json.loads(s)
except ValueError as problem:
m = re.match(
r'Extra data: line \d+ column \d+ - line \d+ column \d+ .char (\d+) - \d+.',
problem.message)
if not m:
raise
extraStart = int(m.group(1))
return json.loads(s[:extraStart]), jsonMultiParse(s[extraStart:])
print jsonMultiParse('{}[{}] \n\n["foo", 3]')
将打印:
({}, ([{}], [u'foo', 3]))
如果您希望获得直接元组而不是嵌套元组:
return (json.loads(s),)
和
return (json.loads(s[:extraStart]),) + jsonMultiParse(s[extraStart:])
返回:
({}, [{}], [u'foo', 3])