在Python中解析两个JSON字符串

在Python中解析两个JSON字符串,python,json,Python,Json,套接字接收JSON格式的字符串,并可能接收多个字符串,这将导致一个包含如下内容的变量: {'a':'1','b':'44'}{'a':'1','b':'44'} 如您所见,它是一个变量中的多个JSON字符串。如何在Python中解码这些内容 我的意思是,在Python中有没有办法将两个JSON字符串解码成一个数组,或者仅仅是一种知道输出中可能有两个字符串的方法 使用新行分割它们不是一个好主意,因为数据实际上可能有新行。您可以使用标准JSON解析器,并利用它在正确的JSON字符串后面有额外数据时

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

{'a':'1','b':'44'}{'a':'1','b':'44'}
如您所见,它是一个变量中的多个JSON字符串。如何在Python中解码这些内容

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


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

您可以使用标准JSON解析器,并利用它在正确的JSON字符串后面有额外数据时抛出的描述性异常

当前(即我的JSON解析器版本)抛出一个
ValueError
,其消息如下:
“额外数据:第3行第1列-第3行第6列(char 5-10)”

在这种情况下,数字
5
提供了解析失败的信息(您可以使用a轻松地从消息中解析该数字)。因此,如果出现异常,可以解析原始输入的一个子字符串,即解析之前的所有字符,然后(我建议递归地)解析其余字符

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),)

返回:

({}, [{}], [u'foo', 3])

套接字是如何接收字符串的?{code>“{'a':'1','b':'44'}{'a':'1','b':'44'}”?考虑基于@hjpotter92编写一个简单的解析器(可能使用正则表达式),这很简单。只需将两个json字符串写入一个不带分隔符的流中。您可以控制套接字的输出格式吗?如果您可以像
[{'a':'1','b':'44'},{'a':'1','b':'44'}]
那样格式化输出,它将是有效的
JSON
,并且可以由
JSON
-parser进行解析。多个线程通过同一个套接字发送,同时最多有200个线程发送。。。也许我会发送一个分隔符,如“YT&^^%Fe54&^Rh8R%R”?这在json中是不可能的。。。我想这种方法的主要问题在于它依赖于抛出的异常的格式。即。它可以随着每一个新版本而改变,或者完全停止运行。当然,以更好的方式(字段)提供此信息的适当例外情况会更好。如果能得到第一个完整的值以及它使用了多少个字符,那就更好了。但我们必须接受我们所拥有的,这很聪明!我认为它应该在JSON模块中实现,它本身
JSON.multipass
,这就足够了。我现在就试试看,聪明的做法是在Json模块中实现它,因为通过捕获和重试,您可以多次有效地解析所有内容。哦,我刚刚在Martijn的帖子(作为潜在重复的答案)中看到,您可以使用
JSONDecoder().raw_decode()
返回我想要的内容:第一个Json对象和消耗的字节数。有了这一点,我们的函数就没有了难看的捕捉和重试。是的,但是如果有新行或任何其他垃圾数据,这将不起作用,可以通过一些编辑在这段代码中解决:)(查找第一个{“额外数据”部分之后)
({}, [{}], [u'foo', 3])