2 votes

JSON.parse envoie "SyntaxError : Nombre inattendu" lorsqu'il essaie d'analyser une chaîne de caractères unique stockée dans un cookie.

Cette chaîne est stockée dans un cookie

"d967fac49ef2466239168bbbde0a8d755a27ba81$[[\"__json_message\"\05425\054\"This is a message.\"]]"

AKA

"\"d967fac49ef2466239168bbbde0a8d755a27ba81$[[\\\"__json_message\\\"\\05425\\054\\\"This is a message.\\\"]]\""

(pour coller dans une console)

mais je ne peux pas l'analyser avec JSON.parse. Par contre, il fonctionne avec eval (ce qui est diabolique). L'erreur est SyntaxError: Unexpected number .

Il convient de noter les virgules échappées. Ceci a été généré avec l'API de messagerie de Django.

Quelqu'un connaît-il une bonne expression rationnelle ou une autre technique permettant de faire cela à la place ?

Je dois d'abord désencoder la chaîne, (parce que c'est une chaîne javascript correcte) et ensuite j'ai besoin de le tableau après le dollar ( s.substring(s.indexOf("$")+1) ).

3voto

forivall Points 2975

Désolé de ne pas avoir été clair, j'ai trouvé la solution grâce au lien de jfriend00 vers json.org . Ci-dessous se trouve une chaîne équivalente qui fonctionne, et ce que la sortie correcte est supposée être. Il s'agit d'un tableau JSON à l'intérieur d'une chaîne déjà encodée que j'avais besoin de désencapsuler facilement.

var s = JSON.parse("\"d967fac49ef2466239168bbbde0a8d755a27ba81$[[\\\"__json_message\\\"\\u002C25\\u002C\\\"This is a message.\\\"]]\"")
// s = "d967fac49ef2466239168bbbde0a8d755a27ba81$[["__json_message",25,"This is a message."]]"
// and then I get what I actually want
var a = JSON.parse(s.substring(s.indexOf("$")+1))

Le problème est que lorsque la chaîne a été préparée pour le cookie, les virgules ont été converties en codes d'échappement octaux, ce que JSON ne permet pas. Le code d'erreur aurait dû être JSON forbids octal prefixes . Une fois ce problème réglé, tout ira bien. Je vais donc vérifier les codes d'échappement octaux et les remplacer par des codes d'échappement hexagonaux.


TL;DR : "SyntaxError : Nombre inattendu" signifie "SyntaxError : JSON interdit les préfixes octaux"


Voici la fonction que j'ai utilisée

var s = "\"d967fac49ef2466239168bbbde0a8d755a27ba81$[[\\\"__json_message\\\"\\05425\\054\\\"This is a message.\\\"]]\""
var re = /\\0([0-7]{2})/g
JSON.parse(s.replace(re, function(m, n){return "\\x"+("0000"+parseInt(n,8).toString(16)).slice(-4)}))

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