我有一个无效的JSON响应:
{"a": 1, "b": {...}}{"x": 2, "y": 3}
我无法修复源代码,所以我必须修复它。
我想只提取这个JSON块:{"a": 1, "b": {...}}
这是因为它附加了我想忽略的第二块元数据JSON {"x": 2, "y": 3}
。
如何将正则表达式格式化为
a)只接受第一个JSON blob(直到最后一个{
之前的空格)
b)删除最后一个JSON块(我会说找出字符串中的最后一个{
,这样我就可以在它之前拆分。
方法B可能最简单
答案 0 :(得分:2)
就我现在的想法而言,你在JSON的一个小括号旁边永远不会有一个开放的括号,所以你可以通过一个简单的分割来逃脱:
source = '{"a": 1, "b": {"c": 2}}{"x": 2, "y": 3}'
json = source.split(/(?<=\})\s*\{/)[0]
JSON.parse(json)
# => {"a"=>1, "b"=>{"c"=>2}}
答案 1 :(得分:1)
你可以使用正则表达式,但只需拉出你想要的字符串就可以了。
str = '{"a": 1, "b": {"c": 2}}{"x": 2, "y": 3}'
s = str[0, str.index('}{')]
#=> "{\"a\": 1, \"b\": {\"c\": 2}"
puts s
#=> {"a": 1, "b": {"c": 2}
在这里,我假设,在示例中,'}{'
中的大括号之间没有空格。如果可能有零个或多个空格,如下所示:
str = '{"a": 1, "b": {"c": 2}} {"x": 2, "y": 3}'
使用以下(唉,使用正则表达式,尽管是一个简单的正则表达式):
puts str[0, str.index(/\} *\{/)]
#=> {"a": 1, "b": {"c": 2}