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?
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.
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)
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("\"", "\\\"");
The JSON specification at https://www.json.org/ is very simple by design. Escaping characters in JSON strings is not hard. This code works for me:
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;
}
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
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;
}
If you're already using Apache commons, it provides a static method for this:
StringEscapeUtils.escapeJson("some string")
It converts any string into one that's properly escaped for inclusion in JSON
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
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<scope>test</scope>
</dependency>
Consider Moshi's JsonWriter class (source). 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();
Source: Stackoverflow.com