Java转义JSONstring?

我有我发送到NodeJS服务器的以下JSONstring:

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

问题变成当stringmsget包含字符"'

在NodeJS服务器上,我parsingJSON是这样的:

 var obj = JSON.parse(message); 

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

我会用库来为你创build你的JSON String 。 一些选项是:

  • GSON
  • 克罗克福德的自由

这将使处理逃逸变得更容易。 一个例子(使用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"); 
  • json-simple
  • 文件

使用maven时添加pom.xml

 <dependency> <groupId>com.googlecode.json-simple</groupId> <artifactId>json-simple</artifactId> <scope>test</scope> </dependency> 

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

但是,如果这不是一个选项,只需将它添加到您的string之前转义msget:

做到这一点的错误方法是

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

无论是使用(如评论中的build议)

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

要么

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

所有三种变体的样本可以在这里find: http : //ideone.com/Nt1XzO

根据这里的答案,值中的引号需要逃脱。 你可以用\"

所以只要在您的价值报价

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

如果你想简单地转义一个string,而不是一个对象或数组,使用这个:

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

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

尝试用\来replace所有的“和”,这只是为了msget对象(string,我猜),不要忘了\也必须被转义。

考虑Moshi的JsonWriter类。 它有一个非常棒的API,它将复制减less到最小程度,一切都很好地传输到OutputStream。

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