Bug avec JSON.parse Javascript?

console.log(JSON.parse('{"data":"{\"json\":\"rocks\"}"}')); 

Donne une erreur (testé sur Firefox et la console de Chrome). Est-ce un bug avec JSON.parse? Même les décodages sont bien testés avec PHP.

 print_r(json_decode('{"data":"{\"json\":\"rocks\"}"}', true)); 

Cette chaîne est traitée différemment en PHP et JS, c'est-à-dire que vous obtenez des résultats différents.

La seule échappe aux séquences dans les chaînes citées simples en PHP sont \\ et \' . Tous les autres sont publiés littéralement, selon la documentation :

Pour spécifier une citation unique littérale, évadez-la avec une barre oblique inverse ( \ ). Pour spécifier une barre oblique invariable, doublez-la ( \\ ). Toutes les autres instances de la barre oblique inverse seront traitées comme une barre oblique invariable: cela signifie que les autres séquences d'échappement que vous pourriez utiliser, telles que \r ou \n , seront publiées littéralement comme spécifiées plutôt que d'avoir une signification particulière.

Dans JS d'autre part, si une chaîne contient une séquence d'échappement invalide, la barre oblique inverse est rejetée ( CV signifie valeur de caractère):

  • Le CV de CharacterEscapeSequence :: NonEscapeCharacter est le CV du NonEscapeCharacter .
  • Le CV de NonEscapeCharacter :: SourceCharacter mais pas EscapeCharacter ou LineTerminator est le caractère SourceCharacter lui-même.

La citation pourrait ne pas être utile en soi, mais si vous suivez le lien et regardez la grammaire, cela devrait être clair.


Ainsi, en PHP, la chaîne contiendra littéralement \" alors que dans JS ne contiendra que " , ce qui rend invalide JSON:

 {"data":"{"json":"rocks"}"} 

Si vous souhaitez créer une barre oblique légale dans JS, vous devez l'échapper:

 '{"data":"{\\"json\\":\\"rocks\\"}"}' 

Pour avoir une barre oblique légale dans un littéral de chaîne, vous avez besoin de \\ .

 console.log(JSON.parse('{"data":"{\\"json\\":\\"rocks\\"}"}')); 

Cela échappera avec succès aux guillemets internes pour le traitement JSON.

Vous devez échapper à la barre oblique inverse:

 console.log(JSON.parse('{"data":"{\\"json\\":\\"rocks\\"}"}'));​ 

Vous n'avez pas vraiment besoin d'échapper à des guillemets doubles à l'intérieur de guillemets simples et vous avez deux extra citations dans votre entrée autour de l'objet intérieur, juste

 console.log(JSON.parse('{"data":{"json":"rocks"}}')); 

est assez.

Objet avec '' '' ne pas analyser par JSON.parser

Myobj = {\ "json \": \ "rocks \"}

Myobj = {\\ "json \\": \\ "rock \\"}

Les lignes en cours de travail ont fonctionné pour moi

Supprimer le slash

 while(typeof myobj == 'string'){ myobj = JSON.parse(myobj) }