web-dev-qa-db-fra.com

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

Je reçois une erreur "pas bien formée" dans la console d'erreur de Firefox 3.0.7 lorsque le code JavaScript de ma page charge un fichier texte contenant un objet au format JavaScript Object Notation. Si le fichier ne contient rien d'autre que l'objet JSON, l'erreur est générée. Si j'emballe l'objet dans des balises <document> </ document>, cela ne génère pas l'erreur. La demande réussit dans les deux cas, je peux donc simplement l'ignorer, mais je ne veux pas que mon journal des erreurs se remplisse de ces messages.

Voici un exemple de code pour illustrer le problème. Premièrement, le fichier "pas bien formé" appelé "data.json":

{ a: 3 }

Maintenant du code pour charger le fichier:

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

Ce qui produit l'erreur suivante dans la console d'erreur Firefox:

pas bien formé
fichier: //path/to/data.json Ligne: 1
{a: 3}
- ^

Si data.json est modifié en ceci:

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

Il n'y a pas d'erreur. J'ai supposé qu'il se plaignait parce que le fichier JSON brut n'est pas un document XML bien formé. J'ai donc essayé de remplacer le type MIME avant l'appel "send" pour le forcer à se charger en tant que texte brut, mais cela n'a pas fonctionné.

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

Je vais continuer à encapsuler mes données JSON dans un document XML pour éviter toute validation effectuée par XMLHttpRequest, mais j'aimerais savoir s'il est possible de le forcer à charger du texte brut de manière non critique et à ne pas essayer de le faire. validez-le. Sinon, existe-t-il une méthode de chargement de données autre que XMLHttpRequest qui peut être utilisée avec du texte brut?

65
A. Levy

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.

67
jthompson

Premièrement, le vrai JSON est beaucoup plus strict que le JavaScript et, pour être valide, vous devez avoir vos clés citées. 

 { "a": 3 } 

De plus, étant donné que vous utilisez un XMLHttpRequest nu, qui s'attend généralement à recevoir un résultat XML, sauf si les en-têtes MIME spécifient de manière stricte le contraire. 

Cependant, vous souhaiterez peut-être vous simplifier la vie en utilisant simplement un framework JavaScript tel que jQuery, qui résumera tout ce problème pour vous et traitera tous les cas désagréables d'Edge.

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

En outre, si vous utilisez à la fois des règles JSON strictes et une bibliothèque pour les résumer, lorsque les navigateurs commencent à disposer d’analyseurs JSON natifs, elles pourront les utiliser de manière transparente et améliorer considérablement leur vitesse. 

(Ceci est prévu pour arriver plus tôt que tard, et quand cela se produira, vos utilisateurs obtiendront une mise à niveau silencieuse sans aucun effort requis!).

20
Kent Fredric

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

5
Dustin Oprea

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

3
Julian Aubourg

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 redémarré par inadvertance la page exécutée à partir du système de fichiers local (file: //Users/me/Sites/mypage.html) plutôt que du serveur (http: // localhost/~ me/Sites/mypage.html). 

3
prototype

Je recevais également le même message d'avertissement avec XMLHttpRequest() (dans FireFox) lorsque je demandais des ressources marquées par Content-Type: application/json par le serveur.

L'astuce pour moi a été de définir explicitement la propriété XMLHttpRequest.responseType sur json sur l'objet de requête. Par exemple,

var request = new XMLHttpRequest();
request.onreadystatechange = function() { ... }
...
request.open('GET','https://random-domain.com/random-path',true);
request.responseType = 'json';
...
request.send();
1
focorner
Browser --- request expects a given content-type ---> Server
        <-- response contains content-type ----------

Firefox examine l'en-tête HTTP Content-Type . Si l'en-tête de réponse HTTP du serveur ne correspond pas aux attentes du code de votre navigateur, il se plaindra de ce message.

IMHO, ce message d'erreur aurait pu être beaucoup mieux, comme "Attente d'une en-tête Content-Type de réponse ... mais trouvée ...".

0
Christophe Roussy