在Python中解析两个JSON字符串

时间:2014-02-18 13:52:17

标签: python json

套接字接收一个JSON格式的字符串,并且可能会收到多个,这将导致变量包含这样的内容:

{'a':'1','b':'44'}{'a':'1','b':'44'}

如您所见,一个变量中有多个JSON字符串。如何在Python中解码这些?

我的意思是,Python中有没有办法将两个JSON字符串解码为一个数组,或者只是一种知道输出中可能有两个字符串的方法?

使用新行拆分它们不是一个好主意,因为数据实际上可能有新行。

1 个答案:

答案 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])