Подход, который мне нравится использовать, состоит в том, чтобы дополнить / обернуть 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()
.