Podejście, które lubię stosować, to wstawić / owinąć Json literałem obiektu, a następnie zapisać plik z rozszerzeniem .jsonp. Ta metoda pozostawia również oryginalny plik json (test.json) bez zmian, ponieważ zamiast tego będziesz pracować z nowym plikiem jsonp (test.jsonp). Nazwa na opakowaniu może być dowolna, ale musi być taka sama jak funkcja wywołania zwrotnego, której używasz do przetwarzania pliku jsonp. Wykorzystam twój test.json opublikowany jako przykład, aby pokazać dodanie opakowania jsonp dla pliku „test.jsonp”.
json_callback({"a" : "b", "c" : "d"});
Następnie utwórz w skrypcie zmienną wielokrotnego użytku o zasięgu globalnym, aby przechowywać zwracany JSON. Dzięki temu zwrócone dane JSON będą dostępne dla wszystkich innych funkcji w skrypcie zamiast tylko funkcji wywołania zwrotnego.
var myJSON;
Dalej jest prosta funkcja do odzyskania twojego jsona przez wstrzyknięcie skryptu. Zauważ, że nie możemy tutaj użyć jQuery do dołączenia skryptu do nagłówka dokumentu, ponieważ IE nie obsługuje metody .append jQuery. Metoda jQuery skomentowana w poniższym kodzie będzie działać w innych przeglądarkach, które obsługują metodę .append. Jest on dołączony jako odniesienie, aby pokazać różnicę.
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)
}
Dalej jest krótka i prosta funkcja wywołania zwrotnego (o tej samej nazwie co opakowanie jsonp), aby pobrać dane wyników json do zmiennej globalnej.
function json_callback(response){
myJSON = response; // Clone response JSON to myJSON object
$('#json_script').remove(); // Remove json_script from the document
}
Do danych json można teraz uzyskać dostęp za pomocą dowolnej funkcji skryptu za pomocą notacji kropkowej. Jako przykład:
console.log(myJSON.a); // Outputs 'b' to console
console.log(myJSON.c); // Outputs 'd' to console
Ta metoda może nieco różnić się od tego, do czego jesteś przyzwyczajony, ale ma wiele zalet. Po pierwsze, ten sam plik jsonp można załadować lokalnie lub z serwera za pomocą tych samych funkcji. Jako bonus, jsonp jest już w formacie przyjaznym dla wielu domen i może być również łatwo używany z interfejsami API typu REST.
To prawda, że nie ma żadnych funkcji obsługi błędów, ale dlaczego miałbyś ich potrzebować? Jeśli nie możesz uzyskać danych JSON przy użyciu tej metody, możesz założyć się, że masz pewne problemy w samym JSONie i sprawdziłbym to na dobrym walidatorze JSON.
JSON
ciągu już pobierasz obiekt javascript, nie musisz go używaćeval()
.