71 votes

Erreur "pas bien formée" dans Firefox lors du chargement du fichier JSON avec XMLHttpRequest

Je suis un "pas bien formé" erreur dans la console d'erreur de Firefox 3.0.7 lorsque le JavaScript sur ma page charge un fichier texte contenant un objet en JavaScript Object Notation format. Si le fichier ne contient rien, mais l'objet JSON, il produit l'erreur. Si j'envelopper l'objet de <document></document> des balises à ne pas produire de l'erreur. La demande réussit de toute façon, je pouvais l'ignorer, mais je ne veux pas que mon journal d'erreur de remplissage avec ces messages.

Voici un exemple de code pour illustrer le problème. Tout d'abord, le "pas bien formé" fichier appelé "les données.json":

{ a: 3 }

Maintenant un peu de code pour charger le fichier:

var req = new XMLHttpRequest();
req.open("GET", "data.json");
req.send(null);

Qui produit l'erreur suivante dans la console d'erreur de Firefox:

pas bien formé
file://chemin/vers/de données.json Ligne: 1
{ a: 3 }
- ^

Si les données.json est modifié de façon à ce:

<document>{ a: 3 }</document>

Il n'y a pas d'erreur. Je suppose que c'est de se plaindre car la plaine du fichier JSON n'est pas un document XML bien formé, j'ai donc essayé de substitution de la type MIME avant de les "envoyer" appel pour le forcer à charger en tant que texte brut, mais cela ne fonctionne pas.

var req = new XMLHttpRequest();
req.open("GET", "data.json");
req.overrideMimeType("text/plain");
req.send(null);
// Still produces an error!

Je vais continuer avec du papier d'emballage de mes données JSON dans un document XML à obtenir en fonction de ce que la validation de la XMLHttpRequest est l'interprétation, mais j'aimerais savoir si il y a moyen que je puisse le forcer à charger en texte brut sans esprit critique, et de ne pas essayer de le valider. Sinon, est-il une autre méthode de chargement de données en plus de XMLHttpRequest qui peut être utilisé avec texte en clair?

77voto

jthompson Points 2854

Avez-vous essayé d'utiliser le type MIME pour JSON?

 application/json
 

Vous pouvez également configurer votre serveur pour envoyer ce type MIME automatiquement pour les fichiers .json.

21voto

Kent Fredric Points 35592

Tout d'abord, vrai JSON est beaucoup plus strict que le JavaScript, et pour être JSON valide, vous avez eu vos clés de la cité.

 { "a": 3 }

Aussi, tant que vous utilisez un nu-XMLHttpRequest, qui s'attend généralement à recevoir un résultat XML, à moins d'en-têtes MIME spécifier strictement le contraire.

Vous pouvez néanmoins vous souhaitez rendre votre vie plus facile simplement à l'aide d'un framework JavaScript comme jQuery qui va abstraire tout le problème pour vous et traiter toutes les méchants cas de bord.

$.getJSON("data.json",{}, function( data ){ 
  /*  # do stuff here  */ 
});

En outre, si vous utilisez à la fois stricte JSON et l'utilisation d'une bibliothèque à l'abstrait pour vous, quand les navigateurs commencent à avoir JSON native des analyseurs de la bibliothèque sera en mesure de manière transparente l'utilisation de ces et d'obtenir une importante amélioration de la vitesse.

( C'est sensé se passer plus tôt que tard, et quand il arrive, vos utilisateurs auront un silencieux de mise à niveau sans effort requis! ).

7voto

Dustin Oprea Points 1691

Cela se produit également lorsque Content-Type est complètement vide (contournant ainsi la détection de type naturelle).

4voto

Julian Aubourg Points 5495

Ce devrait être {"a": 3} en fait.

4voto

user645715 Points 1196

J'ai trouvé le même message d'erreur mais d'une cause très différente. Après un petit temps de modifications infructueuses du contenu JSON, je me suis rendu compte que j'avais accidentellement redémarré la page en exécutant le système de fichiers local (file: //Users/me/Sites/mypage.html) plutôt que le serveur (http: // localhost / ~ me / Sites / mypage.html).

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