可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have the following JSON string that i am sending to a NodeJS server:
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);
The problem becomes when the string msget
contains the character "
and '
On the NodeJS server i am parsing the JSON like this:
var obj = JSON.parse(message);
Any ideas how i can manage to send all characters without problems?
回答1:
I would use a library to create your JSON String
for you. Some options are:
This will make dealing with escaping much easier. An example (using org.json
) would be:
JSONObject obj = new JSONObject(); obj.put("id", userID); obj.put("type", methoden); obj.put("msg", msget); // etc. final String json = obj.toString(); //
回答2:
org.json.simple.JSONObject.escape()
escapes quotes,, /, \r, \n, \b, \f, \t and other control characters.
import org.json.simple.JSONValue; JSONValue.escape("test string");
Add pom.xml when using maven
com.googlecode.json-simplejson-simpletest
回答3:
The best method would be using some JSON library, e.g. Jackson ( http://jackson.codehaus.org ).
But if this is not an option simply escape msget before adding it to your string:
The wrong way to do this is
String msgetEscaped = msget.replaceAll("\"", "\\\"");
Either use (as recommended in the comments)
String msgetEscaped = msget.replace("\"", "\\\"");
or
String msgetEscaped = msget.replaceAll("\"", "\\\\\"");
A sample with all three variants can be found here: http://ideone.com/Nt1XzO
回答4:
If you want to simply escape a string, not an object or array, use this:
String escaped = JSONObject.valueToString(" Quotes \" ' ' \" ");
http://www.json.org/javadoc/org/json/JSONObject.html#valueToString(java.lang.Object)
回答5:
According to the answer here, quotes in values need to be escaped. You can do that with \"
So just repalce the quote in your values
msget = msget.replace("\"", "\\\"");
回答6:
Try to replace all the " and ' with a \ before them. Do this just for the msget object(String, I guess). Don't forget that \ must be escaped too.
回答7:
Consider Moshi's JsonWriter class. It has a wonderful API and it reduces copying to a minimum, everything is nicely streamed to the OutputStream.
OutputStream os = ...; JsonWriter json = new JsonWriter(Okio.sink(os)); json .beginObject() .name("id").value(userID) .name("type").value(methodn) ... .endObject();