21

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

すべての文字を問題なく送信する方法はありますか?

4

12 に答える 12

29

ライブラリを使用して 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
于 2013-09-19T15:32:01.217 に答える
11

最良の方法は、Jackson ( http://jackson.codehaus.org )などの JSON ライブラリを使用することです。

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

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

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

どちらかを使用してください(コメントで推奨されているように)

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

また

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

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

于 2013-09-19T15:29:26.550 に答える
0

MoshiJsonWriterクラス ( source )を考えてみましょう。素晴らしい API を備えており、コピーを最小限に抑えます。すべてが適切に OutputStream にストリーミングされます。

OutputStream os = ...;
JsonWriter json = new JsonWriter(Okio.sink(os));
json
  .beginObject()
  .name("id").value(userID)
  .name("type").value(methodn)
  ...
  .endObject();
于 2015-07-21T14:05:06.070 に答える
0

ライブラリなしで自分でやりたい場合は、次の Java コードを使用できます。

/**
 * Escapes a string the JSON way.
 *
 * @param text The text to be escaped.
 * @return a string escaped according to the JSON format.
 */
public static String escape(final CharSequence text) {

    if (text == null) {
        return "";
    }
    final StringWriter writer = new StringWriter();
    for (int i = 0, length = text.length(); i < length; i++) {
        final char c = text.charAt(i);
        switch (c) {
            case '"':
                writer.write("\\\"");
                break;
            case '\\':
                writer.write("\\\\");
                break;
            default:
                if (c > 0x1f) {
                    writer.write(c);
                } else {
                    writer.write("\\u");
                    final String hex = "000" + Integer.toHexString(c);
                    writer.write(hex.substring(hex.length() - 4));
                }
        }
    }
    return writer.toString();
}
于 2021-09-26T19:02:23.057 に答える