Comment échapper aux guillemets doubles dans JSON

306

J'essaie d'afficher des guillemets doubles, mais cela montre l'une des barres obliques inverses:

"maingame": {
    "day1": {
        "text1": "Tag 1",
        "text2": "Heute startet unsere Rundreise \\\"Example text\\\". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.</strong> "
    }
}

Lors du rendu en html, il apparaît comme \"Example text\". Quelle est la bonne façon?

user1937021
la source

Réponses:

446

Essaye ça:

"maingame": {
  "day1": {
    "text1": "Tag 1",
     "text2": "Heute startet unsere Rundreise \" Example text\". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.</strong> "
  }
}

(juste une barre oblique inverse ( \) devant les guillemets).

kamituel
la source
9
@DWGuru cela n'a rien à voir avec les commentaires, c'est une séquence d'échappement comme décrit sur ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf (Par. 9 - Chaînes) où il est dit: All characters may be placed within the quotation marks except for the characters that must be escapedet ensuite précise:\" represents the quotation mark character (U+0022)
mastazi
Pour une raison quelconque, cela ne fonctionne pas avec JSON.parse () dans JS.
SacWebDeveloper
32

Quand et où utiliser à la \\\"place. OK si vous êtes comme moi, vous vous sentirez aussi idiot que moi quand j'ai réalisé ce que je faisais après avoir trouvé ce fil.

Si vous créez un fichier / flux de texte .json et importez les données à partir de là, la réponse du flux principal d'une seule barre oblique inverse avant les guillemets doubles: \"est celle que vous recherchez.

Cependant, si vous êtes comme moi et que vous essayez d'obtenir "Tryit Editor" de w3schools.com pour avoir des guillemets doubles dans la sortie du JSON.parse (texte), celui que vous recherchez est le triple barre oblique inverse entre guillemets \\\". C'est parce que vous construisez votre chaîne de texte dans un HTML <script>bloc, et les premiers inserts doubles backslash une seule barre oblique inverse dans la variable de chaîne alors le guillemet backslash suivant insère le guillemet dans la chaîne de sorte que la chaîne de script résultant contient \"de la réponse standard et l'analyseur JSON analyseront cela comme juste les guillemets doubles.

<script>
  var text="{";
  text += '"quip":"\\\"If nobody is listening, then you\'re likely talking to the wrong audience.\\\""';
  text += "}";
  var obj=JSON.parse(text);
</script>

+1: étant donné qu'il s'agit d'une chaîne de texte JavaScript, un guillemet double à double barre oblique inverse \\"fonctionnerait également; parce que les guillemets doubles n'ont pas besoin d'être échappés dans une seule chaîne entre guillemets par exemple '\"'et '"'donnent la même chaîne JS.

Gregor y
la source
Cette solution aide dans une version Swift à construire une chaîne qui est ajoutée aux arguments d'un JSON POST.
Nick N
18

Cela montre la barre oblique inverse, car vous échappez également à la barre oblique inverse.

Outre les guillemets doubles, vous devez également échapper les barres obliques inverses si vous souhaitez en inclure une dans votre chaîne entre guillemets JSON. Cependant, si vous avez l'intention d'utiliser une barre oblique inverse dans une séquence d'échappement, vous ne devez évidemment pas y échapper.

Alex Worden
la source
9

Notez que cela se produit le plus souvent lorsque le contenu a été "double codé", ce qui signifie que l'algorithme de codage a été accidentellement appelé deux fois.

Le premier appel coderait la valeur "text2":

DE: Heute startet unsere Rundreise "Exemple de texte". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

À: Heute startet unsere Rundreise \ "Exemple de texte \". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

Un deuxième encodage le reconvertit ensuite, en échappant les caractères déjà échappés:

FROM: Heute startet unsere Rundreise \ "Exemple de texte \". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

À: Heute startet unsere Rundreise \\\ "Exemple de texte \\\". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

Donc, si vous êtes responsable de l'implémentation du serveur ici, assurez-vous qu'il n'y a pas deux étapes pour essayer de coder le même contenu.

Ben
la source
6
Je crois que l'encodeur échapperait également au commutateur d'échappement, donc je pense que votre deuxième TO: devrait lire: "Heute startet unsere Rundreise \\\" Example text \\\ ". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.
Jonathan Mee
1
@Jonathan Mee: Je viens de modifier la réponse en fonction de votre suggestion. Il a été théoriquement écrit correctement avec 3 barres obliques inversées, mais stackoverflow utilise également des barres obliques inversées pour les citations et a converti les deux premières barres obliques inverses en une seule barre oblique inverse
huha
5

si vous souhaitez échapper aux guillemets doubles dans JSON, utilisez \\ pour y échapper.

exemple si vous voulez créer json d'objet javascript suivant

{time: '7 "o" clock'}

alors vous devez écrire de la manière suivante

'{"time":"7 \\"o\\" clock"}'

si nous l'analysons en utilisant JSON.parse()

JSON.parse('{"time":"7 \\"o\\" clock"}')

le résultat sera

{time: "7 "o" clock"}
manas
la source
1

Pour échapper aux barres obliques inverses qui causent des problèmes pour les données JSON, j'utilise cette fonction.

//escape backslash to avoid errors
var escapeJSON = function(str) {
    return str.replace(/\\/g,'\\');
};
mbokil
la source
6
J'encourage les programmeurs à encoder le contenu, au lieu de supprimer (ou "nettoyer") le contenu. Il y avait cette idée de "nettoyer" les données de la base de données - en particulier la suppression des guillemets simples ('). Les programmeurs n'ont pas réalisé que les gens ne pouvaient pas utiliser leur propre nom de famille (O'Doul). J'espère que les programmeurs d'aujourd'hui utilisent d'autres moyens pour obtenir le contenu original dans la base de données sans supprimer ni nettoyer les données.
DanBaker
Ok j'ai enlevé la partie de dépouillement de caractère pour apaiser les masses. @DanBaker gardez à l'esprit que le retrait du texte des caractères pourrait être le seul moyen de sécuriser JS dans une application cliente. Angular nettoie la sortie HTML pour cette raison par défaut.
mbokil
Je suis d'accord à 100%, il y a des moments où les données doivent être nettoyées ... et XSS est l'un de ces moments. Merci de l'avoir signalé.
DanBaker
0

Pour ceux qui souhaitent utiliser le PowerShell développeur. Voici les lignes à ajouter à votre settings.json:

"terminal.integrated.automationShell.windows": "C:\\Windows\\SysWOW64\\WindowsPowerShell\\v1.0\\powershell.exe",
"terminal.integrated.shellArgs.windows": [
    "-noe",
    "-c",
    " &{Import-Module 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools\\Common7\\Tools\\Microsoft.VisualStudio.DevShell.dll'; Enter-VsDevShell b7c50c8d} ",
    ],
erikeah
la source