3

一部の値に二重引用符が含まれている可能性がある JSON があります。私のパーサーは、これらの値を値の末尾として正しく解釈しますが、実際にはユーザーが入力した二重引用符であり、値自体の一部です。理想的には、これはクライアント側でエスケープされますが、この状況では不可能です。その結果、サーバー側でこれを修正する必要があります。サーバー コードは Java サーブレットです。最も簡単な方法は、正規表現を使用して、この問題が発生する可能性のあるフィールドを見つけ、その中の引用符を置き換えることだと思います。値の末尾にある正当な引用符と、値自体の内部にある誤った引用符を区別する必要があるため、これはやや注意が必要です。

サンプル JSON:

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

編集: このフィールドは、特定の状況では実際には最後になる場合があります。その場合、閉じ括弧が続きます。

上記の要件を満たす引用符を見つけるための正規表現の作成に苦労しました。だから私の質問は:

上記の基準を満たす引用符を見つける正規表現は何ですか? ない場合、この問題を別の方法で解決するにはどうすればよいですか?

追加の詳細: 同じ文字列に複数の JSON 配列がある場合とない場合がありますが、それらを文字列の配列に分割することはできます。

4

1 に答える 1

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"
}
于 2013-07-03T18:45:30.040 に答える