70

当我页面上的 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 Line: 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 之外,还有另一种可以与纯文本一起使用的数据加载方法吗?

4

9 回答 9

76

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

application/json

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

于 2009-03-24T15:32:21.387 回答
21

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

 { "a": 3 } 

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

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

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

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

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

于 2009-03-24T15:33:12.057 回答
7

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

于 2010-11-02T19:12:58.413 回答
4

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

于 2009-03-24T15:33:33.197 回答
4

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

于 2012-04-09T13:39:31.940 回答
0

在请求服务器标记为的资源时,我也收到了与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();
于 2016-09-20T22:58:30.613 回答
0
Browser --- request expects a given content-type ---> Server
        <-- response contains content-type ----------

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

恕我直言,此错误消息可能会好得多,例如“期望响应内容类型标头...但找到...”。

于 2017-10-12T09:34:12.390 回答
0

除非有特殊原因直接从磁盘打开 HTML ( file://),否则您应该帮自己一个忙,并由本地 HTTP 服务器 ( http://) 打开它,就像原型用户所写的那样。这将解决这个问题,因为MIME 类型将被正确设置,正如 jthompson 建议的那样

多亏了这一点,您也不会遇到另一个问题,例如“原因:CORS 请求不是 HTTP ”,可能还有其他问题,因为浏览器在被要求打开本地磁盘上的文件时变得越来越可疑 - 并且有充分的理由(安全!)。


如果您的系统上有 Python,那么(可以说)运行本地 HTTP 服务器的最简单方法是:

Mac/Linux: python3 -m http.server

窗户: python -m http.serverpy -3 -m http.server

当前工作目录中的文件将在 http://localhost:8000/ 下提供

于 2021-10-15T09:58:18.873 回答
-6

肯特,我不同意。

以下“有效”的 JSON:

{ a: 3 }

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

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

我刚刚通过将 json 作为“text/javascript”添加到我的网络服务器 mime 类型文件中解决了这个问题:

text/javascript                 js, json

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

于 2010-11-24T07:23:53.667 回答