web-dev-qa-db-fra.com

Échappement Java JSON String?

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?

5
Alosyius

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
17
jabclab

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>
14
Yeongjun Kim

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

9
Dirk Lachowski

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;
}
4
Ron DeSantis

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)

3
rhengles

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("\"", "\\\"");
2

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();
0
orip

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é.

0
Silviu Burcea