Java转义JSON字符串?

时间:2013-09-19 15:23:50

标签: java json node.js

我有以下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);

任何想法如何设法发送所有字符没有问题?

11 个答案:

答案 0 :(得分:17)

我会使用库为您创建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

答案 1 :(得分:13)

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>

答案 2 :(得分:9)

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

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

执行此操作的错误方法是

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

使用(根据评论中的建议)

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

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

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

答案 3 :(得分:5)

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

答案 4 :(得分:3)

如果您想简单地转义字符串,而不是对象或数组,请使用:

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

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

答案 5 :(得分:3)

Apache Commons

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

StringEscapeUtils.escapeJson("some string")

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

See the documentation here

答案 6 :(得分:2)

根据答案here,需要转义值中的引号。您可以使用\"

执行此操作

所以只需重新评估你的值中的引用

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

答案 7 :(得分:2)

\x0

答案 8 :(得分:0)

尝试在它们之前替换所有的“和”。只为msget对象(String,我猜)。不要忘记\必须转义\。

答案 9 :(得分:0)

考虑Moshi&#39; JsonWriter课程。它有一个很棒的API,它可以将复制减少到最少,所有内容都很好地流式传输到OutputStream。

self.title = "A Title"

答案 10 :(得分:0)

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