4

我有一个应用程序收到了这样的格式错误的 JSON 字符串:

{'username' : 'xirby'}

我需要'用双引号替换单引号"

有了这些规则(我认为):

  • 单引号出现在 a 之后,{带有一个或多个空格
  • 出现在一个或多个空格之前,并且:
  • 跟在 a 之后:,多了一个空格
  • 出现在一个或多个空格之前,并且}

所以这个字符串{'username' : 'xirby'}

{  'username' : 'xirby'  }

将转换为:

{"username" : "xirby"}

更新:

还有一个可能的格式错误的 JSON 字符串:

{  'message' : 'there's not much to say'  }

在此示例中,不应替换消息值中的单引号。

4

7 回答 7

2

试试这个正则表达式:

\s*\'\s*

并调用 Replace with"将完成这项工作。看这里

于 2013-06-09T11:56:31.940 回答
2

与其这样做,不如使用 JSON 解析器,它可以读取这种格式错误的 JSON 并为您“规范化”它。杰克逊可以做到这一点:

final ObjectReader reader = new ObjectMapper()
    .configure(Feature.ALLOW_SINGLE_QUOTES, true)
    .reader();

final JsonNode node = reader.readTree(yourMalformedJson);

// node.toString() does the right thing
于 2013-06-09T11:56:47.197 回答
2

此正则表达式将捕获所有适当的单引号和相关的空格,同时忽略消息中的单引号。可以用双引号替换捕获的字符,同时保留 JSON 格式。它还推广到具有多条消息的 JSON 字符串(由逗号分隔,)。

((?<={)\s*\'|(?<=,)\s*\'|\'\s*(?=:)|(?<=:)\s*\'|\'\s*(?=,)|\'\s*(?=}))

我知道您为 java 标记了您的问题,但我更熟悉 python。这是一个如何在 python 中用双引号替换单引号的示例:

import re
regex = re.compile('((?<={)\s*\'|(?<=,)\s*\'|\'\s*(?=:)|(?<=:)\s*\'|\'\s*(?=,)|\'\s*(?=}))')
s = "{   'first_name'   :   'Shaquille'     ,    'lastname'   :   'O'Neal'     }"
regex.sub('"', s)

> '{"first_name":"Shaquille","lastname":"O\'Neal"}'

{},:此方法使用前瞻和后瞻操作查找符号旁边的单引号。

于 2017-06-06T21:10:41.957 回答
1
String test = "{'username' : 'xirby'}";
String replaced = test.replaceAll("'", "\"");
于 2013-06-09T11:49:41.233 回答
1

关于您问题的标签是JAVA,我用JAVA回答。

首先导入库:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

然后:

Pattern p = Pattern.compile("((?<=(\\{|\\[|\\,|:))\\s*')|('\\s*(?=(\\}|(\\])|(\\,|:))))");
String s = "{   'firstName'   :   'Malus'     ,    'lastName'   :   ' Ms'Malus'     , marks:[   '  A+  ', 'B+']}";
String replace = "\"";
String o;

Matcher m = p.matcher(s);
o = m.replaceAll(replace);
System.out.println(o);

输出:

{"firstName":"Malus","lastName":" Ms'Malus", marks:["  A+  ","B+"]}
于 2018-03-14T15:29:26.883 回答
0

如果您希望完全满足所有这些条件,请尝试以下操作:

'{(\s)?\'(.*)\'(\s)?:(\s)?\'(.*)\'(\s)?}'

当你正则表达式。它使用(\s)?匹配一个或零个空白字符。

于 2013-06-09T11:59:03.063 回答
-1

我建议您使用 JSON 解析器而不是 REGEX。

String strJson = "{  'username' : 'xirby'  }";
strJson = new JSONObject(strJson).toString();
System.out.println(strJson);
于 2013-06-09T12:18:02.297 回答