2010-04-09 7 views
0

Quelqu'un at-il remarqué quelque chose de mal avec ce JSON? Il valide sur JSONLint.com, mais ni les fonctions d'analyse JSON natives de Chrome ni celles de Firefox ne l'analysent correctement.Quel est le problème avec mon JSON?

Des idées?

{ 
     "result": "{\"players\":[{\"name\":\"User 522\",\"turn\":true,\"score\":0},{\"name\":\"User 925\",\"turn\":false,\"score\":5}],\"enableControls\":false}", 
     "error": "null", 
     "id": "7" 
} 
+5

Je ne l'analyserais pas non plus, ça n'a pas l'air sympa. –

+0

D'où vient ce JSON? Un serveur? Ou créez-vous en JavaScript pour passer à une autre fonction JavaScript? – Bob

+0

Ça vient d'un serveur. Il est produit par org.json, la bibliothèque Java de json.org. – Ronald

Répondre

1

Je vois maintenant ce qui se passe. result est lui-même une chaîne json intégrée.

Permettez-moi de me regrouper et de répondre à nouveau.

Votre serveur ne vous fait pas de promotion ici.

Encore une fois, la chaîne telle qu'elle est donnée ne sera PAS analysée et n'est donc pas une chaîne JSON valide. Et je ne vois pas de moyen de le masser pour l'analyser.

Etes-vous sûr que c'est la chaîne qui est retournée ou peut-être c'est une visualisation de la chaîne à partir d'un débogueur?

Ce n'est pas du texte JSON valide, c'est un littéral JavaScript quelque peu mal agencé. Vous n'analysez pas un littéral, vous analysez du texte pour obtenir un littéral.

Votre littéral serait mieux représentée comme ...

var obj = { 
    result: { 
     players: [{ 
      name: "User 522", 
      turn: true, 
      score: 0 
     }, 
     { 
      name: "User 925", 
      turn: false, 
      score: 5 
     }], 
     enableControls: false 
    }, 
    error: null, 
    id: 7 
}; 

ce qui est l'équivalent texte JSON. Essayez cette analyse ..

var json = '{"result":{"players":[{"name":"User522","turn":true,"score":0},{"name":"User925","turn": false,"score":5}],"enableControls":false},"error":null,"id":7}'; 

+0

devrait être un commentaire. JSON est une représentation sous forme de chaîne d'un objet JavaScript, il est plutôt courant que les questionneurs publient sans les délimiteurs de chaîne. Cela ne rend pas la question moins valable. –

+0

@Andy - merci pour cela. : - J'étais en train d'expliquer. Et, qu'il soit courant ou non de représenter une structure de données, il n'est pas inapproprié de signaler la différence. –

+0

@Sky: vous avez élargi votre réponse, donc downvote supprimé (conformément à ma politique de suppression downvote, paragraphe 23 ligne 7 ;-)). En effet, il est pas inutile de souligner la différence, mais il est plus approprié d'utiliser les commentaires pour une telle chose :-) –

3

Même si vous JSON semble un peu bizarre, il est conforme à la spécification JSON.

Votre problème provient d'un problème d'échappement lors de la définition de littéraux dans Firefox ou Chrome. Le caractère "\" (barre oblique inverse) doit être échappé avec une barre oblique inverse.

Exemple 1:

JSON.parse('{"key":"\""}'); breaks 

Exemple 2:

JSON.parse('{"key":"\\""}'); works 

Alors JSONLint.com est juste, et Firefox est juste et Chrome est bon aussi.

Vous ne rencontreriez pas ce problème si vous étiez en train de tester via une requête ajax, car l'échappement serait géré automatiquement. Vous rencontrez le problème parce que vous voulez alimenter la chaîne json comme un littéral (d'où le besoin de s'échapper)

J'espère que cela vous aidera.

+1

@Jerome WAGNER: Je pense que le \ est seulement là pour échapper aux citations. – R0MANARMY

+1

La norme json impose des guillemets autour des valeurs. Donc, si vous voulez un guillemet double dans une valeur de chaîne json, vous devez l'échapper avec une barre oblique inverse. C'est pour le côté json du problème. Maintenant, lorsque vous entrez une chaîne littérale entre guillemets simples dans Firefox, la barre oblique inverse doit être échappée avec une barre oblique inverse. Qui n'aime pas s'échapper? –

+0

Curieux: « { "résultat": "{\" joueurs \ ": [{\" nom \ ": \" utilisateur 522 \ », \ "tour \": true, \ "note \": 0}, {\ "name \": \ "Utilisateur 925 \", \ "tour \": faux, \ "score \": 5}], \ "enableControls \": false} "," erreur ":" null ", "id": "7"} '. replace (' \ ',' '); Produit « SyntaxError: jeton inattendu ILLÉGALE » La même erreur que je reçois quand je tente d'utiliser JSON.parse – Ronald

Questions connexes