JSON-Objekt in Internet Explorer 8 undefiniert

70

Derzeit schreibe ich eine JavaScript-Datei und habe die folgende Zeile:

var res = "JSON=" + JSON.stringify(result);

Das Ergebnis wird direkt über dieser Linie gesetzt. Das Problem, das ich habe, ist, dass IE8 (also nur IE8) mir meldet, dass JSON irgendwie undefiniert ist. Ich bin mir nicht sicher, was ich davon halten soll, da IE8 nach meinem Verständnis ein Browser ist, der JSON-Unterstützung implementiert. Hat jemand eine Idee, was los sein könnte?

Schlüsselbohrung
quelle
4
Befinden Sie sich im Kompatibilitätsmodus?
SLaks

Antworten:

117

Stellen Sie sicher, dass Sie sich tatsächlich im IE 8-Modus befinden, indem Sie die bevorzugte Methode verwenden, einen Standard-Doctype ...

<!DOCTYPE html>

... oder die unerwünschte Methode, das X-UA-CompatibleMeta-Tag / Header ...

<meta http-equiv="X-UA-Compatible" content="IE=EDGE" />

Weitere Informationen finden Sie unter Definieren der Dokumentkompatibilität .

Andy E.
quelle
9
Es lohnt sich auf jeden Fall, dies zu überprüfen, da der Kompatibilitätsmodus ausgelöst werden kann, ohne dass Sie es unbedingt bemerken. Öffnen Sie die Entwicklertools (F12) und suchen Sie in der Symbolleiste nach dem Browsermodus.
Spudley
2
Ich habe diese Zeile eingefügt und die Entwicklungswerkzeuge überprüft. Läuft definitiv im IE8-Standardmodus.
Keybored
@keybored: Dann muss etwas das globale JSON-Objekt überschreiben. Überprüfen Sie Ihren Code auf Variationen von JSON =(der Beispielcode, den Sie in der Frage geschrieben haben, ist ein guter Anfang - verwenden Sie eval?).
Andy E
Ich habe so etwas noch nicht gesehen, aber ich habe mich gefragt, ob der obige Anruf innerhalb eines Iframes erfolgt. Müsste ich den Elternteil anrufen, um tatsächlich zu JSON zu gelangen?
Keybored
2
Schließlich habe ich das Problem behoben. Es stellte sich heraus, dass dies nicht der Fall war, ABER die IE7-Kompatibilität war eines der nächsten Dinge, an denen ich arbeiten musste, und Sie haben mir zweifellos bereits Zeit gespart. Vielen Dank!
Keybored
9

Die Verwendung von jQuery.parseJSON hat dies für mich gelöst, falls Sie bereits JQuery verwenden.

Chen
quelle
6

Andere Dinge, bei denen kein oder ein falscher Doctype oder ein Fehler in der HTML-Syntax vorliegt, zwingen den IE, andere Dokumentmodi als erwartet zu verwenden.

Ich habe einfaches "" in einem Testdokument verwendet und das Fehlen des TITLE-Tags als untergeordnetes Element des HEAD-Tags hat window.JSON undefiniert.

Denken Sie immer daran, dass es besser ist, die Ressource anhand der Browserversion zu testen. Und wenn Ihre Benutzer IE mit Emulation von Dokumentmodi verwenden können, ist es besser, wenn Sie einen Code haben, um JSON.parse und JSON.stringify bereitzustellen, wenn Eingeborene undefiniert sind.

Thadeu de Paula
quelle
3
function parseJson(jsonString) {
    if ($.browser.msie && $.browser.version < 8) {
        return eval('(' + jsonString + ')');
    }
    else {
        return JSON.parse(jsonString);
    }
}
mq3w
quelle
Dies versucht nicht einmal, die Frage zu beantworten.
Mark Amery
2

Kann passieren, obwohl <!DOCTYPE html>die Seitencodierung UTF-8mit BOM(Byte Order Mark) ist. Versuchen Sie, die Datei mit einem geeigneten Texteditor wie UTF-8ohne zu speichern BOM.

user126083
quelle
1

Fügen Sie folgenden Code in Ihre js-Datei ein.

var JSON = JSON || {};

// implement JSON.stringify serialization
JSON.stringify = JSON.stringify || function (obj) {

var t = typeof (obj);
if (t != "object" || obj === null) {

    // simple data type
    if (t == "string") obj = '"'+obj+'"';
    return String(obj);

}
else {

    // recurse array or object
    var n, v, json = [], arr = (obj && obj.constructor == Array);

    for (n in obj) {
        v = obj[n]; t = typeof(v);

        if (t == "string") v = '"'+v+'"';
        else if (t == "object" && v !== null) v = JSON.stringify(v);

        json.push((arr ? "" : '"' + n + '":') + String(v));
    }

    return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
}
};

// implement JSON.parse de-serialization
JSON.parse = JSON.parse || function (str) {
if (str === "") str = '""';
eval("var p=" + str + ";");
return p;
 };
atom217
quelle
2
Abgesehen von dem Mangel an Versuchen, die Frage tatsächlich zu beantworten , ist dies ein schrecklicher Code. Neben den undurchsichtigen Ein-Buchstaben-Variablennamen eval, der fehlerhaften Formatierung und dem Rückgriff auf das Parsen ist der Kicker, dass der Stringifizierer nicht einmal funktioniert. Es gibt das falsche Ergebnis für jede Zeichenfolge zurück, die ein doppeltes Anführungszeichen, eine neue Zeile, einen Backslash oder wahrscheinlich viele andere Dinge enthält.
Mark Amery
-1

Überprüfen Sie die jQuery-Version. jQuery 2.0 beendet die Unterstützung für IE 6, 7 und 8 . Verwenden Sie stattdessen jQuery 1.x, das weiterhin offiziell unterstützt wird. Sie können diesen Code verwenden.

<script src="http://code.jquery.com/jquery-1.9.0.js"></script>
<script src="http://code.jquery.com/jquery-migrate-1.2.1.js"></script>

Lesen Sie mehr über jquery migrate .

Wenn dies nicht funktioniert, lesen Sie diesen Artikel .

saeid mohammad hashem
quelle
2
Das OP hat nicht gesagt, dass er jQuery verwendet, und selbst wenn er es wäre, fragt er nach dem nativen JSONglobalen, der nicht Teil von jQuery ist. Diese Antwort ist völlig irrelevant.
Mark Amery
-1

In meinem Fall lag der undefinierte Fehler darin, dass mir eine JSON-Bibliothek fehlte.

Sie können ein JSON-Objekt wie folgt hinzufügen (ersetzen Sie den relativen Pfad durch Ihren eigenen Pfad):

<script>
        if (typeof window.JSON == 'undefined') {
          document.write('<script src="../scripts/json2.js"><\/script>'); 
        }
</script>

Für die json2-Bibliothek: http://cdnjs.com/libraries/json2/

Es gibt auch eine json3-Bibliothek: http://cdnjs.com/libraries/json3/

Dann können Sie in Ihrem Code darauf verweisen:

var array = [];
array[1] = "apple";
array[2] = "orange";
alert(JSON.stringify(array));
Live-Liebe
quelle