Un approccio che mi piace usare è quello di riempire / avvolgere il json con un oggetto letterale, quindi salvare il file con un'estensione .jsonp. Questo metodo inoltre lascia inalterato il file json originale (test.json), in quanto lavorerai con il nuovo file jsonp (test.jsonp). Il nome sul wrapper può essere qualsiasi, ma deve essere lo stesso nome della funzione di callback che usi per elaborare il jsonp. Userò il tuo test.json pubblicato come esempio per mostrare l'aggiunta del wrapper jsonp per il file 'test.jsonp'.
json_callback({"a" : "b", "c" : "d"});
Successivamente, crea una variabile riutilizzabile con ambito globale nello script per contenere il JSON restituito. Ciò renderà i dati JSON restituiti disponibili per tutte le altre funzioni nello script anziché solo per la funzione di callback.
var myJSON;
Poi arriva una semplice funzione per recuperare il tuo JSON mediante l'iniezione di script. Si noti che non è possibile utilizzare jQuery qui per aggiungere lo script all'intestazione del documento, poiché IE non supporta il metodo .append jQuery. Il metodo jQuery commentato nel codice seguente funzionerà su altri browser che supportano il metodo .append. È incluso come riferimento per mostrare la differenza.
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)
}
La prossima è una funzione di callback breve e semplice (con lo stesso nome del wrapper jsonp) per ottenere i dati dei risultati json nella variabile globale.
function json_callback(response){
myJSON = response; // Clone response JSON to myJSON object
$('#json_script').remove(); // Remove json_script from the document
}
I dati json sono ora accessibili da qualsiasi funzione dello script usando la notazione a punti. Come esempio:
console.log(myJSON.a); // Outputs 'b' to console
console.log(myJSON.c); // Outputs 'd' to console
Questo metodo può essere leggermente diverso da quello a cui sei abituato a vedere, ma presenta molti vantaggi. Innanzitutto, lo stesso file jsonp può essere caricato localmente o da un server utilizzando le stesse funzioni. Come bonus, jsonp è già in un formato compatibile tra domini e può anche essere facilmente utilizzato con le API di tipo REST.
Certo, non ci sono funzioni di gestione degli errori, ma perché dovresti averne bisogno? Se non riesci a ottenere i dati JSON usando questo metodo, puoi praticamente scommettere che hai dei problemi con il JSON stesso e lo controllerei su un buon validatore JSON.
JSON
stringa, stai già recuperando un oggetto JavaScript, non è necessario utilizzarloeval()
.