21

我将以下 JSON 字符串发送到 NodeJS 服务器:

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

我会使用一个库为String您创建 JSON。一些选项是:

这将使处理逃跑更容易。一个示例(使用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 回答
18

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>
于 2015-02-07T19:24:17.157 回答
17

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;
}
于 2018-05-25T06:33:14.450 回答
13

阿帕奇公地

如果您已经在使用 Apache commons,它为此提供了一个静态方法:

StringEscapeUtils.escapeJson("some string")

它将任何字符串转换为正确转义以包含在 JSON 中的字符串

请参阅此处的文档

于 2020-03-05T15:10:37.577 回答
11

最好的方法是使用一些 JSON 库,例如 Jackson ( http://jackson.codehaus.org )。

但是,如果这不是一个选项,只需在将 msget 添加到您的字符串之前将其转义:

这样做的错误方法是

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

要么使用(如评论中推荐的那样)

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

或者

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

可以在此处找到包含所有三种变体的示例:http: //ideone.com/Nt1XzO

于 2013-09-19T15:29:26.550 回答
4

根据此处的答案,需要对值中的引号进行转义。你可以这样做\"

因此,只需替换您的价值观中的报价

msget = msget.replace("\"", "\\\"");
于 2013-09-19T15:28:17.547 回答
4

如果您只想转义字符串,而不是对象或数组,请使用以下命令:

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

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

于 2015-10-02T18:04:17.363 回答
2
public static String ecapse(String jsString) {
    jsString = jsString.replace("\\", "\\\\");
    jsString = jsString.replace("\"", "\\\"");
    jsString = jsString.replace("\b", "\\b");
    jsString = jsString.replace("\f", "\\f");
    jsString = jsString.replace("\n", "\\n");
    jsString = jsString.replace("\r", "\\r");
    jsString = jsString.replace("\t", "\\t");
    jsString = jsString.replace("/", "\\/");
    return jsString;
}
于 2019-11-04T08:02:48.507 回答
2

build.gradle(如果使用 maven,进行类似更改)中包含此依赖项:

implementation group: 'org.apache.avro', name: 'avro-tools', version: '1.10.2'

然后:

import net.minidev.json.JSONValue;
String escapedString = JSONValue.escape(yourString);
于 2021-06-28T21:31:59.593 回答
0

尝试用 \ 替换所有的 " 和 '。这样做只是为了 msget 对象(我猜是字符串)。不要忘记 \ 也必须被转义。

于 2013-09-19T15:28:08.003 回答
0

考虑MoshiJsonWriter类(source)。它有一个很棒的 AP​​I,它将复制减少到最低限度,一切都很好地流式传输到 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 回答