在使用XMLHttpRequest加载JSON文件时,Firefox中的“格式不正确”错误
当我的页面上的JavaScript加载一个包含JavaScript对象表示法格式的对象的文本文件时,我在Firefox 3.0.7的错误控制台中收到了一个“格式不正确”的错误。 如果文件只包含JSON对象,则会产生错误。 如果我将这个对象包装在<document> </ document>标记中,它不会产生错误。 请求成功的方式,所以我可以忽略它,但我不希望我的错误日志填满这些消息。
下面是一些示例代码来说明问题。 首先,名为“data.json”的“格式不正确”的文件:
{ a: 3 }
现在一些代码来加载文件:
var req = new XMLHttpRequest(); req.open("GET", "data.json"); req.send(null);
在Firefox错误控制台中会产生以下错误:
不完善
file://path/to/data.json行:1
{a:3}
– ^
如果data.json被修改为:
<document>{ a: 3 }</document>
没有错误。 我认为这是抱怨,因为普通的JSON文件不是一个格式良好的XML文档,所以我试图在“发送”调用之前覆盖MIMEtypes,强制它作为纯文本加载,但没有奏效。
var req = new XMLHttpRequest(); req.open("GET", "data.json"); req.overrideMimeType("text/plain"); req.send(null); // Still produces an error!
我将继续将我的JSON数据包装在一个XML文档中,以解决XMLHttpRequest正在执行的任何validation问题,但是我想知道是否有任何方法可以强制它仅仅加载纯文本而不尝试validation它。 或者,除了XMLHttpRequest之外,还有其他的加载数据的方法可以用于纯文本吗?
您是否尝试过使用JSON的MIMEtypes?
application/json
你也可以configuration你的服务器自动发送这个MIMEtypes的.json文件。
首先,真正的JSON比JavaScript要严格得多,要成为有效的JSON,你必须要引用你的密钥。
{ "a": 3 }
另外,因为您正在使用纯粹的XMLHttpRequest,通常希望接收XML结果,除非MIME标头另有指定。
但是,你可能希望简单地使用一个JavaScript框架,比如jQuery,这样可以为你抽象掉所有这些问题,并处理所有讨厌的边界情况。
$.getJSON("data.json",{}, function( data ){ /* # do stuff here */ });
此外,如果您同时使用严格的JSON并使用库来为您抽象,那么当浏览器开始使用本机JSONparsing器时,库将能够透明地使用这些parsing器并显着提高速度。
(这将会比以后更早发生,而且当这种情况发生时,您的用户将无需付费即可进行无提示升级)。
当Content-Type完全为空时(也就是规避自然types检测),也会发生这种情况。
实际上应该是{“a”:3}。
我发现了相同的错误信息,但来自一个非常不同的原因。 经过一段时间没有任何改变的JSON内容,意识到我不小心重启了本地文件系统(file://Users/me/Sites/mypage.html)而不是服务器(http:// localhost / 〜我/网站/的mypage.html)。
当请求由服务器标记为Content-Type: application/json
的资源时,我也得到了与XMLHttpRequest()
(在FireFox中)相同的警告消息。
对我来说,诀窍是明确地将XMLHttpRequest.responseType
属性设置为请求对象上的json
。 例如,
var request = new XMLHttpRequest(); request.onreadystatechange = function() { ... } ... request.open('GET','https://random-domain.com/random-path',true); request.responseType = 'json'; ... request.send();
Browser --- request expects a given content-type ---> Server <-- response contains content-type ----------
Firefox查看HTTP Content-Type标头 。 如果服务器的HTTP响应头不符合您的浏览器代码的期望,它会抱怨这个消息。
恕我直言,这个错误信息可能已经好多了,如“期待响应内容types标题…但find…”。
肯特,我不同意。
以下是 “有效的”JSON:
{ a: 3 }
JavaScript对象的属性名称不一定是string。
问题是MIMEtypes之一,而不是JSON / JavaScript语法。
我刚刚解决了这个问题,将json添加为“text / javascript”到我的webserver mime types文件中:
text/javascript js, json
“格式不正确”的错误消失了。 浏览器(FireFox)错误地认为.json文件是XML。