it-swarm.com.de

Fehler "nicht wohlgeformt" in Firefox beim Laden der JSON-Datei mit XMLHttpRequest

In der Fehlerkonsole von Firefox 3.0.7 wird ein Fehler angezeigt, wenn das JavaScript auf meiner Seite eine Textdatei lädt, die ein Objekt im JavaScript-Format "Object Notation" enthält. Wenn die Datei nur das JSON-Objekt enthält, wird der Fehler ausgegeben. Wenn ich das Objekt in <document> </ document> -Tags einhülle, wird der Fehler nicht angezeigt. Die Anfrage ist in beiden Fällen erfolgreich, daher könnte ich sie einfach ignorieren, aber ich möchte nicht, dass mein Fehlerprotokoll diese Meldungen auffüllt.

Hier ist ein Beispielcode, um das Problem zu veranschaulichen. Zuerst die "nicht wohlgeformte" Datei mit dem Namen "data.json":

{ a: 3 }

Nun etwas Code zum Laden der Datei:

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

Was verursacht den folgenden Fehler in der Firefox-Fehlerkonsole:

nicht wohlgeformt
file: //path/to/data.json Zeile: 1
{a: 3}
- ^

Wenn data.json dazu geändert wird:

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

Es liegt kein Fehler vor. Ich nahm an, dass dies ein Problem ist, da es sich bei der einfachen JSON-Datei nicht um ein wohlgeformtes XML-Dokument handelt. Daher habe ich versucht, den MIME-Typ vor dem "send" -Aufruf zu überschreiben, um das Laden als reinen Text zu erzwingen. Dies funktionierte jedoch nicht.

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

Ich werde mit dem Einbetten meiner JSON-Daten in ein XML-Dokument fortfahren, um die Gültigkeitsprüfung von XMLHttpRequest zu umgehen, aber ich würde gerne wissen, ob ich irgendwie zwingen kann, nur einfachen Text unkritisch zu laden und nicht zu versuchen bestätige es. Gibt es alternativ eine andere Methode zum Laden von Daten neben XMLHttpRequest, die mit Nur-Text verwendet werden kann?

65
A. Levy

Haben Sie versucht, den MIME-Typ für JSON zu verwenden?

application/json

Sie können Ihren Server auch so konfigurieren, dass dieser MIME-Typ automatisch für .json-Dateien gesendet wird.

67
jthompson

Erstens ist True JSON viel strenger als JavaScript, und um gültig zu sein, müssen Sie Ihre Schlüssel zitieren lassen. 

 { "a": 3 } 

Außerdem verwenden Sie ein nacktes XMLHttpRequest, das im Allgemeinen erwartet, ein XML-Ergebnis zu erhalten, es sei denn, MIME-Header geben ausdrücklich etwas anderes an. 

Möglicherweise möchten Sie jedoch Ihr eigenes Leben einfacher machen, indem Sie einfach ein JavaScript-Framework wie jQuery verwenden, das all dieses Problem für Sie beseitigt und alle bösen Edge-Fälle behandelt.

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

Wenn Sie sowohl strikte JSON als auch eine Bibliothek verwenden, um diese für Sie zu abstrahieren, können Browser, wenn native JSON-Parser verwendet werden, diese Bibliothek transparent verwenden und eine deutliche Verbesserung der Geschwindigkeit erzielen. 

(Dies wird voraussichtlich früher als später geschehen, und wenn dies der Fall ist, erhalten Ihre Benutzer ein unbeaufsichtigtes Upgrade ohne Aufwand!).

20
Kent Fredric

Dies ist auch der Fall, wenn der Inhaltstyp vollständig leer ist (wodurch die natürliche Typerkennung umgangen wird).

5
Dustin Oprea

Es sollte tatsächlich {"a": 3} sein.

3
Julian Aubourg

Ich habe dieselbe Fehlermeldung gefunden, aber aus einer ganz anderen Ursache. Nach kurzer Zeit ohne Erfolg den JSON-Inhalt zu ändern, wurde mir klar, dass ich versehentlich die Seite neu gestartet hatte, die aus dem lokalen Dateisystem (file: //Users/me/Sites/mypage.html) und nicht aus dem Server (http: // localhost/~ me/Sites/mypage.html). 

3
prototype

Die gleiche Warnmeldung wurde auch mit XMLHttpRequest() (in FireFox) angezeigt, als vom Server als Content-Type: application/json markierte Ressourcen angefordert wurden.

Der Trick für mich bestand darin, die XMLHttpRequest.responseType-Eigenschaft des Anforderungsobjekts explizit auf json zu setzen. Z.B,

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 betrachtet den HTTP Content-Type-Header . Wenn der HTTP-Response-Header des Servers nicht den Erwartungen Ihres Browsercodes entspricht, wird er sich mit dieser Nachricht beschweren.

IMHO hätte diese Fehlermeldung viel besser sein können, z. B. "Erwarte Antwort Content-Type-Header ... aber gefunden ...".

0