在使用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。