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

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

编辑:
事实上,在某些情况下,此字段可能是最后一个,在这种情况下,它后面会跟一个右大括号。
我一直在努力创建一个regex来找到满足上述要求的报价。所以我的问题是:
什么是正则表达式,如果有的话,将发现符合以上标准的报价?如果没有,这个问题怎么能用另一种方法解决呢?
另一个细节是:在同一个字符串中可能有多个json数组,也可能没有多个json数组,尽管我可以将它们拆分为一个字符串数组。

最佳答案

您需要先提取应答字符串,然后转义双引号。
请考虑以下代码:

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"
}

10-07 14:17
查看更多