3

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

示例 JSON:

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

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

我一直在努力创建一个正则表达式来找到满足上述要求的报价。所以我的问题是:

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

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

4

1 回答 1

1

You need to extract the answer string first and then escape the double quotes.

Consider this code:

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);

OUTPUT:

{
   "question" : "some question",
   "answer": "some answer that might have \"quotes\" in it.",
   "name": "some name"
}
于 2013-07-03T18:45:30.040 回答