J'ai la chaîne JSON suivante que j'envoie à un serveur 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);
Le problème se pose lorsque la chaîne msget
contient les caractères "
et '
.
Sur le serveur NodeJS, j'analyse le JSON comme ceci:
var obj = JSON.parse(message);
Des idées comment je peux réussir à envoyer tous les caractères sans problèmes?
Je voudrais utiliser une bibliothèque pour créer votre JSON String
pour vous. Certaines options sont:
Cela facilitera beaucoup la tâche de s'échapper. Un exemple (en utilisant org.json
) serait:
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()
échappe aux guillemets , /,\r,\n,\b,\f,\t et à d'autres caractères de contrôle.
import org.json.simple.JSONValue;
JSONValue.escape("test string");
Ajoutez pom.xml lorsque vous utilisez maven
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<scope>test</scope>
</dependency>
La meilleure méthode consisterait à utiliser une bibliothèque JSON, par exemple. Jackson ( http://jackson.codehaus.org ).
Mais si ce n'est pas une option, échappez simplement msget avant de l'ajouter à votre chaîne:
La mauvaise façon de faire est
String msgetEscaped = msget.replaceAll("\"", "\\\"");
Soit utilisation (comme recommandé dans les commentaires)
String msgetEscaped = msget.replace("\"", "\\\"");
ou
String msgetEscaped = msget.replaceAll("\"", "\\\\\"");
Vous trouverez un exemple avec les trois variantes ici: http://ideone.com/Nt1XzO
La spécification JSON à https://www.json.org/ est très simple de par sa conception. Échapper aux caractères dans les chaînes JSON n'est pas difficile. Ce code fonctionne pour moi:
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;
}
Si vous voulez simplement échapper à une chaîne, pas à un objet ou à un tableau, utilisez ceci:
String escaped = JSONObject.valueToString(" Quotes \" ' ' \" ");
http://www.json.org/javadoc/org/json/JSONObject.html#valueToString(Java.lang.Object)
Selon la réponse ici , il faut échapper les guillemets dans les valeurs. Vous pouvez le faire avec \"
Donc, repalcez simplement la citation dans vos valeurs
msget = msget.replace("\"", "\\\"");
Considérez Moshi 's JsonWriter class. Il a une API merveilleuse et réduit au minimum la copie, tout est bien transmis au flux de sortie.
OutputStream os = ...;
JsonWriter json = new JsonWriter(Okio.sink(os));
json
.beginObject()
.name("id").value(userID)
.name("type").value(methodn)
...
.endObject();
Essayez de remplacer tous les "et 'par un\avant eux. Faites ceci uniquement pour l'objet msget (String, je suppose). N'oubliez pas que\doit également être échappé.