我喜欢使用的一种方法是使用对象文字填充/包装 json,然后使用 .jsonp 文件扩展名保存文件。此方法还使您的原始 json 文件 (test.json) 保持不变,因为您将使用新的 jsonp 文件 (test.jsonp)。包装器上的名称可以是任何名称,但它必须与用于处理 jsonp 的回调函数名称相同。我将使用您发布的 test.json 作为示例来显示“test.jsonp”文件的 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 文件。作为奖励,jsonp 已经是跨域友好格式,也可以轻松地与 REST 类型的 API 一起使用。
诚然,没有错误处理功能,但你为什么需要一个呢?如果您无法使用此方法获取 json 数据,那么您几乎可以打赌 json 本身存在一些问题,我会在一个好的 JSON 验证器上检查它。