214 votes

Comment échapper à une chaîne JSON contenant des caractères de nouvelle ligne en utilisant JavaScript ?

Je dois former une chaîne JSON dans laquelle une valeur a un caractère de nouvelle ligne. Ce caractère doit être échappé et ensuite affiché en utilisant un appel AJAX. Quelqu'un peut-il suggérer un moyen d'échapper à la chaîne avec JavaScript. Je n'utilise pas jQuery.

3 votes

J'ai essayé d'échapper le caractère de la nouvelle ligne \n a \\n. Il fonctionne bien. Mais je cherche une bibliothèque JS qui peut faire cela pour tous les caractères d'échappement.

1 votes

Pourquoi devez-vous échapper les nouvelles lignes dans le JSON ? Comment ces valeurs sont-elles décodées lorsqu'elles sont utilisées, car la solution appropriée est d'utiliser la fonction d'encodage correspondante.

0 votes

J'ai passé 6 heures à essayer toutes sortes de choses avec des tonnes de variations pour découvrir qu'un petit slash supplémentaire faisait tout fonctionner comme par magie les choses que je pensais être difficiles prenaient 5 minutes... la chose que je pensais être donnée est devenue impossible... omg

159voto

Alex Points 21247

Prenez votre JSON et .stringify() il. Ensuite, utilisez le .replace() et remplacer toutes les occurrences de \n avec \\n .

EDIT :

Pour autant que je sache, il n'existe pas de bibliothèque JS connue pour l'échappement de tous les caractères spéciaux dans une chaîne de caractères. Mais, vous pourriez enchaîner les .replace() et remplacez tous les caractères spéciaux comme ceci :

var myJSONString = JSON.stringify(myJSON);
var myEscapedJSONString = myJSONString.replace(/\\n/g, "\\n")
                                      .replace(/\\'/g, "\\'")
                                      .replace(/\\"/g, '\\"')
                                      .replace(/\\&/g, "\\&")
                                      .replace(/\\r/g, "\\r")
                                      .replace(/\\t/g, "\\t")
                                      .replace(/\\b/g, "\\b")
                                      .replace(/\\f/g, "\\f");
// myEscapedJSONString is now ready to be POST'ed to the server. 

Mais c'est plutôt méchant, n'est-ce pas ? C'est là qu'intervient la beauté des fonctions, car elles vous permettent de diviser le code en morceaux et de garder le flux principal de votre script propre, et sans 8 enchaînés. .replace() appels. Mettons donc cette fonctionnalité dans une fonction appelée , escapeSpecialChars() . Allons-y et attachons le à la prototype chain de la String de sorte que nous pouvons appeler escapeSpecialChars() directement sur les objets String.

Comme ça :

String.prototype.escapeSpecialChars = function() {
    return this.replace(/\\n/g, "\\n")
               .replace(/\\'/g, "\\'")
               .replace(/\\"/g, '\\"')
               .replace(/\\&/g, "\\&")
               .replace(/\\r/g, "\\r")
               .replace(/\\t/g, "\\t")
               .replace(/\\b/g, "\\b")
               .replace(/\\f/g, "\\f");
};

Une fois que nous avons défini cette fonction, le corps principal de notre code est aussi simple que ceci :

var myJSONString = JSON.stringify(myJSON);
var myEscapedJSONString = myJSONString.escapeSpecialChars();
// myEscapedJSONString is now ready to be POST'ed to the server

3 votes

Merci Alex. Je dois faire cela pour tous les caractères d'échappement, n'est-ce pas ? Existe-t-il une bibliothèque JS pour faire cela ?

0 votes

Cela a fonctionné avec une petite modification. var myEscapedJSONString = myJSONString.replace(/ \n /g, " \\n ") ; Cela a remplacé toutes les occurrences de ' \n '. Pouvez-vous suggérer une bibliothèque JS pour faire cela ? Sinon, je dois gérer tous les caractères d'échappement. Merci d'avance.

5 votes

Voici la fonction exacte qui a résolu mon problème String.prototype.escapeSpecialChars = function() { return this.replace(/ \\ /g, " \\\\ "). replace(/ \n /g, " \\n "). replace(/ \r /g, " \\r "). replace(/ \t /g, " \\t "). replace(/ \f /g, " \\f "). replace(/"/g," \\\ ""). replace(/'/g," \\\ '"). replace(/\&/g, " \\ &") ; }

86voto

Ryan Points 1830

Comme l'a suggéré l'utilisateur 667073, sauf qu'il faut d'abord réorganiser le remplacement des barres obliques inversées et corriger le remplacement des guillemets.

escape = function (str) {
  return str
    .replace(/[\\]/g, '\\\\')
    .replace(/[\"]/g, '\\\"')
    .replace(/[\/]/g, '\\/')
    .replace(/[\b]/g, '\\b')
    .replace(/[\f]/g, '\\f')
    .replace(/[\n]/g, '\\n')
    .replace(/[\r]/g, '\\r')
    .replace(/[\t]/g, '\\t');
};

5 votes

Vous n'êtes pas obligé de faire tout cela. Seulement backslash, newline, linefeed, et les deux quotes. Et ça manque : guillemet simple, Line separator \u2028 y Paragraph separator \u2029 . Réf : es5.github.io/#x7.3

2 votes

Sympa, mais pourquoi les crochets sont-ils nécessaires et non : escape = fonction (str) { return str .replace(/) \\ /g, ' \\\\ ') .replace(/\"/g, ' \\\ "") .replace(/\//g, ' \\ /') .replace(/ \b /g, ' \\b ') .replace(/ \f /g, ' \\f ') .replace(/ \n /g, ' \\n ') .replace(/ \r /g, ' \\r ') .replace(/ \t /g, ' \\t ') ; } ;

5 votes

Parfait. la réponse acceptée (au-dessus de celle-ci) ne fonctionne tout simplement pas. en utilisant nodeJS.

28voto

whaefelinger Points 352

J'ai peur de dire que la réponse donnée par Alex est plutôt incorrecte, pour ne pas dire plus :

  • Certains caractères qu'Alex tente d'échapper ne doivent pas être échappés du tout (comme & et ') ;
  • \b n'est pas du tout le caractère de retour en arrière mais plutôt une correspondance de limite de mot
  • Les caractères devant être échappés ne sont pas traités.

Cette fonction

escape = function (str) {
    // TODO: escape %x75 4HEXDIG ?? chars
    return str
      .replace(/[\"]/g, '\\"')
      .replace(/[\\]/g, '\\\\')
      .replace(/[\/]/g, '\\/')
      .replace(/[\b]/g, '\\b')
      .replace(/[\f]/g, '\\f')
      .replace(/[\n]/g, '\\n')
      .replace(/[\r]/g, '\\r')
      .replace(/[\t]/g, '\\t')
    ; };

semble être une meilleure approximation.

6 votes

En fait, vous devriez changer l'ordre pour remplacer les barres obliques inverses avant les guillemets doubles, sinon vous obtiendrez \\\\ ". De même, la ligne de citation devrait être .replace(/[\"]/g, ' \\\ "')

12voto

Akash Dhawale Points 41

Une petite mise à jour pour les guillemets simples

function escape (key, val) {
    if (typeof(val)!="string") return val;
    return val      
        .replace(/[\\]/g, '\\\\')
        .replace(/[\/]/g, '\\/')
        .replace(/[\b]/g, '\\b')
        .replace(/[\f]/g, '\\f')
        .replace(/[\n]/g, '\\n')
        .replace(/[\r]/g, '\\r')
        .replace(/[\t]/g, '\\t')
        .replace(/[\"]/g, '\\"')
        .replace(/\\'/g, "\\'"); 
}

var myJSONString = JSON.stringify(myJSON,escape);

8voto

Sam Points 37

Il s'agit d'un ancien article, mais il peut encore être utile pour ceux qui utilisent angular.fromJson et JSON.stringify. escape() est déprécié. Utilisez ceci à la place,

var uri_enc = encodeURIComponent(uri); //before you post the contents
var uri_dec = decodeURIComponent(uri_enc); //before you display/use the contents.

réf. http://www.w3schools.com/jsref/jsref_decodeuricomponent.asp

0 votes

Stringify fait déjà tout l'échappement pour vous -- je suis curieux de savoir pourquoi ne pas simplement l'utiliser ? git.io/vglq7

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