我有一个应用程序收到格式错误的JSON字符串,如下所示:
{'username' : 'xirby'}
我需要用双重'
替换单引号"
有了这些规则(我认为):
{
之后:
:
再增加一个空格}
所以这个字符串{'username' : 'xirby'}
或
{ 'username' : 'xirby' }
将转变为:
{"username" : "xirby"}
更新
也可能是格式错误的JSON字符串:
{ 'message' : 'there's not much to say' }
在此示例中,不应替换消息值中的单引号。
答案 0 :(得分:2)
答案 1 :(得分:2)
最好不要使用JSON解析器,它可以读取这种格式错误的JSON并为您“规范化”它。 Jackson可以做到这一点:
final ObjectReader reader = new ObjectMapper()
.configure(Feature.ALLOW_SINGLE_QUOTES, true)
.reader();
final JsonNode node = reader.readTree(yourMalformedJson);
// node.toString() does the right thing
答案 2 :(得分: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"}'
此方法使用预读和后视操作在符号{},:
旁边查找单引号。
答案 3 :(得分:1)
String test = "{'username' : 'xirby'}";
String replaced = test.replaceAll("'", "\"");
答案 4 :(得分:0)
如果您希望完全满足所有这些条件,请尝试以下方法:
'{(\s)?\'(.*)\'(\s)?:(\s)?\'(.*)\'(\s)?}'
正如你的正则表达式。它使用(\ s)?匹配一个或零个空白字符。
答案 5 :(得分:0)
关于您的问题标签是 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+"]}
答案 6 :(得分:-1)
我建议您使用JSON解析器而不是REGEX。
String strJson = "{ 'username' : 'xirby' }";
strJson = new JSONObject(strJson).toString();
System.out.println(strJson);