NodeJSサーバーに送信している次のJSON文字列があります。
String string = "{\"id\":\"" + userID + "\",\"type\":\"" + methoden + "\",\"msg\":\"" + msget + "\", \"name\":\"" + namnet + "\", \"channel\":\"" + activeChatChannel + "\", \"visitorNick\":\"\", \"agentID\":\" " + agentID + "\"}";
PrintWriter pw = new PrintWriter(new OutputStreamWriter(os, "utf-8"));
pw.println(string);
問題は、文字列msget
に文字"
および'
が含まれる場合になります
NodeJSサーバーでは、次のようにJSONを解析しています。
var obj = JSON.parse(message);
すべてのキャラクターを問題なく送信する方法はありますか?
ライブラリを使用してJSON String
を作成します。いくつかのオプションは次のとおりです。
これにより、エスケープ処理がはるかに簡単になります。例(org.json
) だろう:
JSONObject obj = new JSONObject();
obj.put("id", userID);
obj.put("type", methoden);
obj.put("msg", msget);
// etc.
final String json = obj.toString(); // <-- JSON string
org.json.simple.JSONObject.escape()
は、引用符、/、\ r、\ n、\ b、\ f、\ tおよびその他の制御文字をエスケープします。
import org.json.simple.JSONValue;
JSONValue.escape("test string");
Mavenを使用するときにpom.xmlを追加します
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<scope>test</scope>
</dependency>
最良の方法は、JSONライブラリを使用することです。ジャクソン( http://jackson.codehaus.org )。
ただし、これがオプションでない場合は、文字列に追加する前にmsgetをエスケープするだけです。
これを行う間違った方法は
String msgetEscaped = msget.replaceAll("\"", "\\\"");
どちらかを使用(コメントで推奨)
String msgetEscaped = msget.replace("\"", "\\\"");
または
String msgetEscaped = msget.replaceAll("\"", "\\\\\"");
3つの亜種すべてを含むサンプルは、ここにあります。 http://ideone.com/Nt1XzO
https://www.json.org/ のJSON仕様は、設計上非常に単純です。 JSON文字列の文字をエスケープするのは難しくありません。このコードは私のために機能します:
private String escape(String raw) {
String escaped = raw;
escaped = escaped.replace("\\", "\\\\");
escaped = escaped.replace("\"", "\\\"");
escaped = escaped.replace("\b", "\\b");
escaped = escaped.replace("\f", "\\f");
escaped = escaped.replace("\n", "\\n");
escaped = escaped.replace("\r", "\\r");
escaped = escaped.replace("\t", "\\t");
// TODO: escape other non-printing characters using uXXXX notation
return escaped;
}
オブジェクトや配列ではなく、単に文字列をエスケープしたい場合は、これを使用します:
String escaped = JSONObject.valueToString(" Quotes \" ' ' \" ");
http://www.json.org/javadoc/org/json/JSONObject.html#valueToString(Java.lang.Object)
答え here によると、値の引用符はエスケープする必要があります。あなたは\"
でそれを行うことができます
だから、あなたの価値観に引用符を置き直してください
msget = msget.replace("\"", "\\\"");
Moshi の JsonWriter クラスを検討してください。素晴らしいAPIを備えており、コピーを最小限に抑え、すべてがOutputStreamにうまくストリームされます。
OutputStream os = ...;
JsonWriter json = new JsonWriter(Okio.sink(os));
json
.beginObject()
.name("id").value(userID)
.name("type").value(methodn)
...
.endObject();
すべての "と 'をそれらの前にある\に置き換えてみてください。msgetオブジェクト(文字列、私は推測します)に対してのみこれを行ってください。\もエスケープする必要があることを忘れないでください。