正则表达式,用于有选择地转义JSON值中的字符

时间:2013-07-03 18:16:01

标签: java regex json servlets

我有一些JSON可能在某些值中有双引号。我的解析器正确地将这些值解释为值的结尾,而实际上它只是用户输入的双引号并且是值本身的一部分。理想情况下,这将在客户端进行转义,但在这种情况下是不可能的。因此,我需要在服务器端更正此问题。服务器代码是一个java servlet,我相信最简单的方法是使用正则表达式来查找可能存在此问题的字段并替换其中的任何引号。这有点棘手,因为我必须区分值末尾的合法引用和值本身内部的错误引用。

示例JSON:

{
 "question" : "some question",
 "answer"   : "some answer that might have "quotes" in it.",
 "name"     : "some name"
}

编辑: 在某些情况下,这个字段实际上可能是最后一个,在这种情况下,它将跟随一个右括号。

我一直在努力创建一个正则表达式以找到符合上述要求的引号。所以我的问题是:

什么是正则表达式,如果有的话,会找到符合上述标准的报价?如果没有,那么如何以另一种方式解决这个问题?

另外一个细节:同一个字符串中可能有多个JSON数组,也可能没有,但我可以将它们分成一个字符串数组。

1 个答案:

答案 0 :(得分:1)

您需要先提取答案字符串然后转义双引号。

考虑以下代码:

Sting str = "{\"question\" : \"some question\", \"answer\": " + 
  "\"some answer that might have \"quotes\" in it.\", \"name\": \"some name\"}";
Matcher m = Pattern.compile
    ("(?s)(?i)(\"answer\"\\s*:\\s*\")(.+?)(?=\"\\s*[,}])").matcher(str);
StringBuffer buf = new StringBuffer();
while (m.find()) {
    m.appendReplacement(buf, m.group(1) + m.group(2).replace("\"", "\\\\\""));
}
m.appendTail(buf);  
System.out.printf("%s%n", buf);

输出:

{
   "question" : "some question",
   "answer": "some answer that might have \"quotes\" in it.",
   "name": "some name"
}