176 votes

Comment dois-je m'échapper des chaînes dans JSON?

Lors de la création manuelle de données JSON, comment dois-je échapper aux champs de chaîne? Devrais-je utiliser quelque chose comme StringEscapeUtilities.escapeHtml , StringEscapeUtilities.escapeXml Apache Commons Lang, ou devrais - je utiliser java.net.URLEncoder ?

Le problème est que lorsque j'utilise SEU.escapeHtml , il n'échappe pas aux guillemets et que, lorsque je passe la chaîne entière dans une paire de ' s, un JSON mal formé est généré.

177voto

Thanatos Points 13444

Idéalement, trouver une librairie JSON dans votre langue que vous pouvez nourrir un structure de données, et de le laisser se soucier de comment échapper des choses. Il va vous garder beaucoup plus saine. Si, pour quelque raison que ce soit vous n'avez pas de bibliothèque dans votre langue, vous ne voulez pas l'utiliser (je ne dirais pas faire1), ou vous êtes en train de rédiger une librairie JSON, lire sur.

D'échappement selon la RFC. JSON est assez libérale: Les seuls caractères que vous devez escape \, ", et les codes de commande (rien de moins que U+0020).

Cette structure de s'échapper est spécifique en JSON. Vous aurez besoin d'un JSON fonction spécifique. Toutes les fuites peuvent être écrites comme \uXXXXXXXX est le code UTF-16 unit1 pour ce caractère. Il y a quelques raccourcis, comme \\, qui fonctionnent aussi bien. (Et ils ont raison dans une plus petite et plus claire de la sortie.)

Pour plus de détails, voir la RFC.

1JSON de s'échapper est construit sur le JS, il utilise \uXXXXXXXX est un code UTF-16 de l'unité. Pour les points de code en dehors de la BMP, cela signifie codant pour les paires de substitution, qui peut obtenir un peu poilue. (Ou, vous pouvez juste sortie le caractère directement, depuis JSON est encodé pour est texte Unicode, et permet à ces caractères particuliers.)

56voto

MonoThreaded Points 1745

Extrait de Jettison :

  public static String quote(String string) {
         if (string == null || string.length() == 0) {
             return "\"\"";
         }

         char         c = 0;
         int          i;
         int          len = string.length();
         StringBuilder sb = new StringBuilder(len + 4);
         String       t;

         sb.append('"');
         for (i = 0; i < len; i += 1) {
             c = string.charAt(i);
             switch (c) {
             case '\\':
             case '"':
                 sb.append('\\');
                 sb.append(c);
                 break;
             case '/':
 //                if (b == '<') {
                     sb.append('\\');
 //                }
                 sb.append(c);
                 break;
             case '\b':
                 sb.append("\\b");
                 break;
             case '\t':
                 sb.append("\\t");
                 break;
             case '\n':
                 sb.append("\\n");
                 break;
             case '\f':
                 sb.append("\\f");
                 break;
             case '\r':
                sb.append("\\r");
                break;
             default:
                 if (c < ' ') {
                     t = "000" + Integer.toHexString(c);
                     sb.append("\\u" + t.substring(t.length() - 4));
                 } else {
                     sb.append(c);
                 }
             }
         }
         sb.append('"');
         return sb.toString();
     }
 

38voto

dpetruha Points 191

Essayez ceci org.codehaus.jettison.json.JSONObject.quote("your string") .

24voto

Dan-Dev Points 212

org.json.simple.JSONObject.escape () échappe aux guillemets, \, /, \ r, \ n, \ b, \ f, \ t et à d'autres caractères de contrôle. Il peut être utilisé pour échapper aux codes JavaScript.

 import org.json.simple.JSONObject;
String test =  JSONObject.escape("your string");
 

24voto

NS du Toit Points 92

Apache commons lang supporte maintenant cela. Assurez-vous simplement d'avoir une version assez récente d'Apache commons lang sur votre chemin de classe. Vous aurez besoin de la version 3.2+

Notes de publication de la version 3.2

LANG-797: Ajouté escape / unescapeJson à StringEscapeUtils.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X