Мені подобається використовувати підхід / загортання json з об’єктним буквалом, а потім збереження файлу з розширенням .jsonp. Цей метод також залишає ваш вихідний файл json (test.json) незмінним, оскільки ви будете працювати з новим файлом jsonp (test.jsonp). Ім'я на обгортці може бути будь-яким, але це має бути тим самим іменем, що і функція зворотного виклику, яку ви використовуєте для обробки jsonp. Я буду використовувати ваш test.json, розміщений як приклад, щоб показати додаток для обгортки jsonp для файлу 'test.jsonp'.
json_callback({"a" : "b", "c" : "d"});
Далі, створіть змінну для багаторазового використання з глобальним діапазоном у своєму сценарії, щоб утримувати повернений JSON. Це зробить повернені дані JSON доступними для всіх інших функцій у вашому сценарії, а не лише для функції зворотного виклику.
var myJSON;
Далі йде проста функція для отримання вашого json шляхом введення сценарію. Зауважте, що ми не можемо використовувати jQuery тут, щоб додати скрипт до голови документа, оскільки IE не підтримує метод jQuery .append. Метод jQuery, коментований у наведеному нижче коді, буде працювати в інших браузерах, які підтримують метод .append. Він включається в якості посилання, щоб показати різницю.
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)
}
Далі - коротка та проста функція зворотного виклику (з тим самим ім'ям, що і jsonp обгортка) для отримання даних результатів json у глобальну змінну.
function json_callback(response){
myJSON = response; // Clone response JSON to myJSON object
$('#json_script').remove(); // Remove json_script from the document
}
Тепер дані json можуть бути доступні будь-якими функціями скрипту, використовуючи крапкові позначення. Як приклад:
console.log(myJSON.a); // Outputs 'b' to console
console.log(myJSON.c); // Outputs 'd' to console
Цей метод може дещо відрізнятися від того, що ви звикли бачити, але має багато переваг. По-перше, той самий файл jsonp можна завантажувати локально або з сервера за допомогою тих же функцій. Як бонус, jsonp вже знаходиться у міждоменному форматі, і його також можна легко використовувати з API типу REST.
Звичайно, функцій поводження з помилками немає, але навіщо вам це потрібно? Якщо ви не в змозі отримати дані json за допомогою цього методу, то ви можете, звичайно, мати певні проблеми в самому json, і я перевірив би це на хорошому валідаторі JSON.
JSON
рядок, ви вже отримуєте об'єкт javascript, не потрібно використовуватиeval()
.