我有一个'几乎'是一个json字符串的字符串,只是它的键没有用引号括起来。 通常它由UI和javascript使用,在解释它时没有问题。但是,我知道Java中的JSON解析器需要使用引号括起来。
有没有办法可以将字符串转换为有效的json字符串,可能是通过在Java中使用正则表达式。 或者是否有一个有点宽松的JSON库。
字符串的格式为
{
A : "Val1",
B : [ SOME NESTED STUFF],
C : "Val3"
}
我需要将其转换为
{
"A" : "Val1",
"B" : [ SOME NESTED STUFF],
"C" : "Val3"
}
不影响任何嵌套的东西。键的数量即A,B,C是固定的。
由于
P.S。我无法将相应的JSON字符串返回给我,它是一个预先存在的代码,更改它是非常危险的。
答案 0 :(得分:1)
如果你碰巧使用Jackson,它支持非标准JSON,包括不带引号的密钥:http://www.cowtowncoder.com/blog/archives/2009/08/entry_310.html
答案 1 :(得分:1)
如果您确定所有以 unquoted_word :
开头的行都需要引用该词,您可以使用以下内容:
str.replaceAll("(?m)^(\s+)(\w+)(\s*:)", "$1\"$2\"$3");
但是,如果你可以,你可能会更好地使用正确的解析器,如其他答案所示。
答案 2 :(得分:0)
使用以下行代码用双引号括起所有键(这里的单大写字母被认为是有效键):
str = str.replaceAll("\s([A-Z])\s\:\s\"", "\"$1\" : ");
答案 3 :(得分:0)
如果你真的想要一个正则表达式,这可能会有效:
jsonString.replaceAll("(\\w+)\\s*\\:","\"$1\" :");
那就是说,如果你真的担心触摸嵌套的东西和角落的情况,你需要一个真正的解析器,而不是正则表达式。如果你的一个值是字符串" A : "
,那么正则表达式就无法精确到足以避免混乱。如果关于jackson解析器的pingw33n是正确的,那么它是迄今为止最好的答案。