当前位置: 首页 > 知识库问答 >
问题:

从字符串中解析有效的 JSON 对象或数组

秦涵映
2023-03-14

我有一个字符串,可以是两种形式之一:

name multi word description {...}

name multi word description [...]

其中<代码> {...}和< code>[...]是任何有效的JSON。我只对解析出字符串的JSON部分感兴趣,但是我不确定最好的方法是什么(特别是因为我不知道字符串将是两种形式中的哪一种)。这是我目前的方法:

import json

string = 'bob1: The ceo of the company {"salary": 100000}' 
o_ind = string.find('{')
a_ind = string.find('[')

if o_ind == -1 and a_ind == -1:
    print("Could not find JSON")
    exit(0)

index = min(o_ind, a_ind)
if index == -1:
    index = max(o_ind, a_ind)

json = json.loads(string[index:])
print(json)

这是有效的,但我忍不住觉得可以做得更好。我想可能是regex,但我在匹配子对象和数组时遇到了问题,而不是最外部的json对象或数组。有什么建议吗?

共有2个答案

罗浩然
2023-03-14

您可以在正则表达式中使用简单的|来匹配两个需要的子字符串:

import re
import json

def json_from_s(s):
    match = re.findall(r"{.+[:,].+}|\[.+[,:].+\]", s)
    return json.loads(match[0]) if match else None

还有一些测试

print json_from_s('bob1: The ceo of the company {"salary": 100000}')
print json_from_s('bob1: The ceo of the company ["salary", 100000]')
print json_from_s('bob1')
print json_from_s('{1:}')
print json_from_s('[,1]')

输出:

{u'salary': 100000}
[u'salary', 100000]
None
None
None
鲜于凯康
2023-03-14

您可以通过检查<code>{

>>> import re
>>> string1 = 'bob1: The ceo of the company {"salary": 100000}'
>>> string2 = 'bob1: The ceo of the company ["10001", "10002"]'
>>> 
>>> re.search(r"\s([{\[].*?[}\]])$", string1).group(1)
'{"salary": 100000}'
>>> re.search(r"\s([{\[].*?[}\]])$", string2).group(1)
'["10001", "10002"]'

这里\s([{\[]. *?[} \]])$ 分解为:

  • \s-单个空格字符
  • 括号是捕获组
  • [{\[]将匹配单个
  • <代码>.*是任何字符的任意次数的非贪婪匹配
  • [}\]]将匹配单个 (后者需要用反斜杠转义)
  • $表示字符串的结尾

或者,您可以使用< code>re.split()将字符串拆分为一个空格,后跟< code>{或< code>[(正向查找),并获得最后一项。它适用于您提供的示例输入,但不确定这是否普遍可靠:

>>> re.split(r"\s(?=[{\[])", string1)[-1]
'{"salary": 100000}'
>>> re.split(r"\s(?=[{\[])", string2)[-1]
'["10001", "10002"]'
 类似资料:
  • 问题内容: 尝试使用gson将以下json字符串解析为java对象 我有我的java类 转换后,我得到的提示对象为空。 有人可以纠正我吗 问题答案: 试试这个JSON: 使用此Java类: 奇迹般有效 输出:

  • 问题内容: 我有一个.NET中的SOAP Web服务返回的JSON字符串。如下: 现在,我想将此字符串解析为JSON对象。我也看了这个,他们已经用这行代码: 所以我可以通过用我的字符串名称替换“ json”来做到这一点。还需要引用除NewtonSoft.dll以外的任何其他dll吗? 顺便说一句,这是完整的网络服务代码 问题答案: 用 您需要System.Web.Extensions dll并导入

  • 问题内容: 如何在Android中解析Json字符串数组并将其保存在Java字符串数组中(例如:xy [])? 我要解析的Json: 稍后在我的代码中,我想用该数组填充布局中的微调项。我尝试过的所有内容都只包含微调框中列出的一个街头商品。 问题答案: 解析 一旦解析并将其添加到数组。使用相同的控件来填充微调框。 表示json数组节点 表示json对象节点

  • 问题内容: 在执行过程中,您将json解组为结构。问题是我有一个api,可能会在请求之间更改键值的类型。 例如,可能是内联对象的对象如下: 而且还可以通过键指向对象,如下所示: 可以内联某些对象,但是可以从多个位置引用其他对象。 在javascript或python中这不是问题。只需检查类型。 解组和解析这两个对象的惯用方式是什么?是反映的唯一方法吗? 问题答案: 您可以将此JSON解组为如下结构

  • 问题内容: 我有以下Json字符串 我正在尝试解析它并打印出每个名称和值-最简单的方法是什么?我尝试了jQuery.parseJSON但我不知道如何使用它 示例代码会很棒 问题答案: 结果是: jsFiddle示例:http://jsfiddle.net/bradchristie/XtzjZ/1/

  • 问题内容: 尝试解析最小值以在Android中映射时出现问题。 有一些示例JSON格式,其中包含更多信息,例如: 该示例最常使用且易于使用,仅使用或即可。 但是,我该如何解析仅使用字符串和值最小格式的这种JSON格式映射到使用循环的Java地图集合。而且因为字符串json总是会彼此不同。例如: 谢谢 问题答案: 您需要获取所有键的列表,对其进行循环,然后将它们添加到地图中,如下例所示: