非Json格式为JSON格式

时间:2012-02-07 23:25:03

标签: java regex json

我有一个'几乎'是一个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字符串返回给我,它是一个预先存在的代码,更改它是非常危险的。

4 个答案:

答案 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是正确的,那么它是迄今为止最好的答案。