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


69

当页面上的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之外,还有没有其他可用于纯文本的加载数据的方法?

Answers:


74

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

application/json

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


8
更具体地说:req.overrideMimeType(“ application / json”); req.send(null); 作品。在服务器中指定MIME类型将是更好的解决方案,但对其进行覆盖也可以。
A. Levy,2009年

应该放在哪里?在JSON文件中?
CodyBugstein 2014年

6
在本地开发时是否可能有这样的解决方案?
MisterJ

20

首先,真正的JSON比JavaScript严格得多,要成为有效的JSON,您必须将密钥加引号。

 { "a": 3 } 

另外,由于您使用的是裸露的XMLHttpRequest,通常期望接收XML结果,除非MIME头另有严格规定。

但是,您可能希望通过简单地使用JavaScript框架(例如jQuery)来简化自己的生活,该框架将为您消除所有这些问题并处理所有令人讨厌的情况。

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

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

(这定会比迟早发生,并且一旦发生,您的用户将获得无提示的升级,而无需付出任何努力!)。


感谢您提供有关JSON的指针。我将更改数据以使用带引号的字符串属性名称。不幸的是,jQuery或其他框架不是我的选择。
A. Levy,2009年

我最感兴趣的是为什么,通常这是强烈地避免代码重用和避免使用已解决问题的代码臭味的标志。
肯特·弗雷德里克

2
@Kent,我很乐意使用jQuery。但是,使用jQuery的批准过程非常困难。与客户争论并证明我们需要使用jQuery所花费的时间是不值得的。悲伤,但是真实。
A. Levy,

@一种。征费:您会学到的,下次您将不太可能手工编写所有内容:)
肯特·弗雷德里克

15
使用$.getJSON()仍然会为我生成该错误消息。
shoosh



3

我发现了相同的错误消息,但是原因却截然不同。在经过一段毫无结果的更改JSON内容后,意识到我不小心重新启动了从本地文件系统(file://Users/me/Sites/mypage.html)而不是服务器(http:// localhost / 〜me / Sites / mypage.html)。


1

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

对我来说,诀窍是在请求对象上将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();

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

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

恕我直言,此错误消息本来可以好得多,例如“正在期待响应Content-Type标头...但已找到...”。


-6

肯特,我不同意。

以下IS “有效” JSON:

{ a: 3 }

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

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

我只是通过将json作为“文本/ javascript”添加到我的网络服务器mime类型文件中来解决此问题:

text/javascript                 js, json

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


8
错误。这是有效的javascript,如果您将其解释为javascript,那就可以了。但是,JSON比javascript更严格,并且JSON格式由符合要求的客户端分别解析,因此不希望“ JSON”而不是“ Javascript”。任何兼容规范的JSON解析器都将未加引号的键视为错误。
肯特·弗雷德里克

1
重申一下,JSON是javascript的子语言,尽管ALL JSON是有效的javascript,但并非所有Javascript都是有效的JSON。
肯特·弗雷德里克

1
如果您不同意我的观点,请向Mozilla投诉,因为您认为他们的JSON解析器是错误的=)。 jsfiddle.net/kentnl/uGDQP
肯特·弗雷德里克

1
我不得不说,要求键具有“”是JSON中的市长缺陷。JS证明这不是必需的,这是额外的低迷。它可能是用来容纳解析器编写器的,而且解析器编写器的数量远远少于用户。我也为无法传递功能而感到悲伤,但这至少是有道理的。
罗德韦克(Lodewijk)2013年

同样,名称“ JavaScript Object Notation”也有误导。它与Javascript中使用的符号不同。
Lodewijk
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.