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

IT技术 javascript firefox xmlhttprequest mime-types
2021-02-17 16:35:59

当我页面上的 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 文档,所以我尝试在“发送”调用之前覆盖 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 之外,还有另一种加载数据的方法可以与纯文本一起使用吗?

6个回答

您是否尝试过对 JSON 使用 MIME 类型?

application/json

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

更具体地说: req.overrideMimeType("application/json"); 请求。发送(空);作品。在服务器中指定 MIME 类型将是更好的解决方案,但覆盖它也有效。
2021-04-21 16:35:59
在本地开发时是否有可能有这样的解决方案?
2021-05-03 16:35:59
这个应该放在哪里?在 JSON 文件中?
2021-05-10 16:35:59

首先,真正的 JSON 比 JavaScript 严格得多,要成为有效的 JSON,您必须引用您的键。

 { "a": 3 } 

此外,由于您使用的是裸 XMLHttpRequest,除非 MIME 标头以其他方式严格指定,否则它通常希望收到 XML 结果。

然而,您可能希望通过简单地使用 JavaScript 框架(例如 jQuery)来让自己的生活更轻松,该框架将为您抽象出所有这些问题并处理所有令人讨厌的边缘情况。

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

此外,如果您同时使用严格的 JSON 并使用一个库来为您抽象它,当浏览器开始使用原生 JSON 解析器时,该库将能够透明地利用这些并获得显着的速度提升。

(这迟早会发生,当它发生时,您的用户将无需付出任何努力即可获得静默升级!)。

感谢您对 JSON 的指点。我将更改我的数据以使用带引号的字符串属性名称。不幸的是,jQuery 或其他一些框架不适合我。
2021-04-16 16:35:59
我最感兴趣的是为什么,通常这是代码臭味的标志,以强烈避免代码重用并避免使用已解决的问题。
2021-04-19 16:35:59
@一个。Levy:你会学到,下次你不太可能手工编写所有东西:)
2021-04-20 16:35:59
使用$.getJSON()仍然为我生成该错误消息。
2021-04-27 16:35:59
@Kent,我很乐意使用 jQuery。但是,使用 jQuery 的审批过程非常困难。与客户争论并证明我们需要使用 jQuery 所花费的时间不值得。悲伤,但真实。
2021-05-11 16:35:59

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

实际上应该是 {"a": 3} 。

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