我喜欢使用的一种方法是用对象文字填充/包装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。请注意,由于IE不支持jQuery .append方法,因此我们不能在此处使用jQuery将脚本附加到文档头。在下面的代码中注释掉的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已经采用了跨域友好的格式,并且可以轻松地与REST类型的API一起使用。
当然,没有错误处理功能,但是为什么需要一个?如果您无法使用此方法获取json数据,那么您可以打赌您在json本身内部存在一些问题,我会在一个不错的JSON验证程序上进行检查。
JSON
字符串时,您已经在检索javascript对象,无需使用eval()
。