使用XMLHttpRequest加载JSON文件时,Firefox中的“格式不正确”错误

时间:2009-03-24 15:25:20

标签: javascript firefox xmlhttprequest mime-types

当我的页面上的JavaScript加载包含JavaScript Object Notation格式的对象的文本文件时,我在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文档,所以我尝试在“发送”调用之前覆盖MIME类型以强制它作为纯文本加载,但这不起作用。

var req = new XMLHttpRequest();
req.open("GET", "data.json");
req.overrideMimeType("text/plain");
req.send(null);
// Still produces an error!

我将继续将我的JSON数据包装在XML文档中,以解决XMLHttpRequest正在执行的任何验证,但我想知道是否有任何方法可以强制它只是不加批判地加载纯文本和不要试图验证它。或者,除了XMLHttpRequest之外还有另一种加载数据的方法可以与纯文本一起使用吗?

8 个答案:

答案 0 :(得分:68)

您是否尝试过将MIME类型用于JSON?

application/json

您还可以将服务器配置为自动为.json文件发送此MIME类型。

答案 1 :(得分:20)

首先,真正的JSON比JavaScript更严格,要成为有效的JSON,你必须引用你的密钥。

 { "a": 3 } 

此外,正在使用裸XMLHttpRequest,它通常希望接收XML结果,除非MIME标头严格指定。

然而,您可以通过简单地使用jQuery之类的JavaScript框架来让自己的生活变得更轻松,这将为您解决所有这些问题,并处理所有令人讨厌的边缘情况。

$.getJSON("data.json",{}, function( data ){ 
  /*  # do stuff here  */ 
});

此外,如果您同时使用严格的JSON并使用库来为您抽象,那么当浏览器开始使用本机JSON解析器时,库将能够透明地利用这些并显着提高速度。

(预计会发生这种情况,并且当它发生时,您的用户将无需升级即可进行静默升级!)。

答案 2 :(得分:5)

当Content-Type完全为空(从而绕过自然类型检测)时,也会发生这种情况。

答案 3 :(得分:3)

实际应该是{“a”:3}。

答案 4 :(得分:3)

我发现了相同的错误消息,但原因却截然不同。经过一段时间无果而终地改变JSON内容,意识到我不小心重新启动了运行本地文件系统的页面(文件://Users/me/Sites/mypage.html)而不是服务器(http:// localhost / 〜我/网站/的mypage.html)。

答案 5 :(得分:1)

当请求服务器标记为Content-Type: application/json的资源时,我也在XMLHttpRequest.responseType(在FireFox中)收到相同的警告消息。

我的诀窍是在请求对象上明确将json属性设置为var request = new XMLHttpRequest(); request.onreadystatechange = function() { ... } ... request.open('GET','https://random-domain.com/random-path',true); request.responseType = 'json'; ... request.send(); 。 E.g,

@echo OFF
setlocal ENABLEDELAYEDEXPANSION
REM Get input directory from user
set /p INPUT_DIR=Please enter full path to directory with files, use double quotes if any space:
cd /d %INPUT_DIR%
for /f %%f in ('dir /b %INPUT_DIR%') do (
    set newname=hello!fullname:~-7!
    ren %%f !newname!
)

答案 6 :(得分:0)

Browser --- request expects a given content-type ---> Server
        <-- response contains content-type ----------

Firefox查看HTTP Content-Type header。 如果服务器HTTP响应标头与您的浏览器代码的期望不符,它将抱怨此消息。

恕我直言这个错误信息本来可以更好,比如&#34;期待响应内容类型标题......但找到了...&#34;。

答案 7 :(得分:-6)

肯特,我不同意。

以下 IS “有效”JSON:

{ a: 3 }

JavaScript对象属性名称不必是字符串。

问题是MIME类型之一,而不是JSON / JavaScript语法。

我刚刚通过将json添加为“text / javascript”到我的webserver mime类型文件来解决这个问题:

text/javascript                 js, json

“格式不正确”的错误消失了。浏览器(FireFox)错误地假定.json文件是XML。