web-dev-qa-db-ja.com

Java JSON文字列をエスケープしますか?

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

すべてのキャラクターを問題なく送信する方法はありますか?

10
Alosyius

ライブラリを使用して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
20
jabclab

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>
14
Yeongjun Kim

最良の方法は、JSONライブラリを使用することです。ジャクソン( http://jackson.codehaus.org )。

ただし、これがオプションでない場合は、文字列に追加する前にmsgetをエスケープするだけです。

これを行う間違った方法は

String msgetEscaped = msget.replaceAll("\"", "\\\"");

どちらかを使用(コメントで推奨)

String msgetEscaped = msget.replace("\"", "\\\"");

または

String msgetEscaped = msget.replaceAll("\"", "\\\\\"");

3つの亜種すべてを含むサンプルは、ここにあります。 http://ideone.com/Nt1XzO

9
Dirk Lachowski

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;
}
7
Ron DeSantis

オブジェクトや配列ではなく、単に文字列をエスケープしたい場合は、これを使用します:

String escaped = JSONObject.valueToString(" Quotes \" ' ' \" ");

http://www.json.org/javadoc/org/json/JSONObject.html#valueToString(Java.lang.Object)

3
rhengles

答え here によると、値の引用符はエスケープする必要があります。あなたは\"でそれを行うことができます

だから、あなたの価値観に引用符を置き直してください

msget = msget.replace("\"", "\\\"");

MoshiJsonWriter クラスを検討してください。素晴らしいAPIを備えており、コピーを最小限に抑え、すべてがOutputStreamにうまくストリームされます。

OutputStream os = ...;
JsonWriter json = new JsonWriter(Okio.sink(os));
json
  .beginObject()
  .name("id").value(userID)
  .name("type").value(methodn)
  ...
  .endObject();
0
orip

すべての "と 'をそれらの前にある\に置き換えてみてください。msgetオブジェクト(文字列、私は推測します)に対してのみこれを行ってください。\もエスケープする必要があることを忘れないでください。

0
Silviu Burcea