Ein Ansatz, den ich gerne verwende, besteht darin, den JSON mit einem Objektliteral aufzufüllen / zu verpacken und die Datei dann mit der Dateierweiterung .jsonp zu speichern. Diese Methode lässt auch Ihre ursprüngliche JSON-Datei (test.json) unverändert, da Sie stattdessen mit der neuen JSONP-Datei (test.jsonp) arbeiten. Der Name auf dem Wrapper kann beliebig sein, muss jedoch mit der Rückruffunktion identisch sein, die Sie zur Verarbeitung des JSONP verwenden. Ich werde Ihre test.json als Beispiel verwenden, um den Jsonp-Wrapper-Zusatz für die Datei 'test.jsonp' anzuzeigen.
json_callback({"a" : "b", "c" : "d"});
Erstellen Sie als Nächstes eine wiederverwendbare Variable mit globalem Gültigkeitsbereich in Ihrem Skript, um den zurückgegebenen JSON zu speichern. Dadurch werden die zurückgegebenen JSON-Daten für alle anderen Funktionen in Ihrem Skript verfügbar und nicht nur für die Rückruffunktion.
var myJSON;
Als nächstes kommt eine einfache Funktion, um Ihren JSON durch Skriptinjektion abzurufen. Beachten Sie, dass wir jQuery hier nicht verwenden können, um das Skript an den Dokumentkopf anzuhängen, da der IE die jQuery .append-Methode nicht unterstützt. Die im folgenden Code auskommentierte jQuery-Methode funktioniert in anderen Browsern, die die .append-Methode unterstützen. Es ist als Referenz enthalten, um den Unterschied zu zeigen.
function getLocalJSON(json_url){
var json_script = document.createElement('script');
json_script.type = 'text/javascript';
json_script.src = json_url;
json_script.id = 'json_script';
document.getElementsByTagName('head')[0].appendChild(json_script);
// $('head')[0].append(json_script); DOES NOT WORK in IE (.append method not supported)
}
Als nächstes folgt eine kurze und einfache Rückruffunktion (mit demselben Namen wie der jsonp-Wrapper), um die json-Ergebnisdaten in die globale Variable zu übertragen.
function json_callback(response){
myJSON = response; // Clone response JSON to myJSON object
$('#json_script').remove(); // Remove json_script from the document
}
Auf die JSON-Daten kann jetzt von allen Funktionen des Skripts unter Verwendung der Punktnotation zugegriffen werden. Als Beispiel:
console.log(myJSON.a); // Outputs 'b' to console
console.log(myJSON.c); // Outputs 'd' to console
Diese Methode unterscheidet sich möglicherweise ein wenig von dem, was Sie gewohnt sind, hat aber viele Vorteile. Erstens kann dieselbe JSONP-Datei lokal oder von einem Server mit denselben Funktionen geladen werden. Als Bonus hat jsonp bereits ein domänenübergreifendes Format und kann auch problemlos mit APIs vom Typ REST verwendet werden.
Zugegeben, es gibt keine Fehlerbehandlungsfunktionen, aber warum sollten Sie eine benötigen? Wenn Sie mit dieser Methode nicht in der Lage sind, die JSON-Daten abzurufen, können Sie darauf wetten, dass Sie Probleme mit dem JSON selbst haben, und ich würde dies auf einem guten JSON-Validator überprüfen.
JSON
Zeichenfolge zurückgeben, rufen Sie bereits ein Javascript-Objekt ab, das Sie nicht verwenden müsseneval()
.