什么是正确的 JSON 内容类型?

我一直在弄乱JSON一段时间,只是将其作为文本推出,并没有伤害任何人(据我所知),但是我想正确地做事。

我见过这么多的所谓的 “标准” 为 JSON 内容类型:

application/json
application/x-javascript
text/javascript
text/x-javascript
text/x-json

但是哪一个是正确的,还是最好的?我发现在它们之间存在安全性和浏览器支持问题。

我知道有一个类似的问题, 如果 REST API 返回 JSON,则为哪种 MIME 类型? ,但我想要一个更有针对性的答案。

答案

对于 JSON 文本:

application/json

JSON 文本的 MIME 媒体类型为application/json 。默认编码为 UTF-8。 (来源: RFC 4627 )。

对于带回调的 JSONP (可运行的 javascript):

application/javascript

这是相关评论中提到的一些博客文章。

IANA已将 JSON 的正式 MIME 类型注册为application/json

当被问及为什么不是text/json ,Crockford 似乎说 JSON 并不是 JavaScript 也不是 text,而且 IANA 比text/*更有可能分发application/* text/*

更多资源:

对于 JSON:

Content-Type: application/json

对于JSON-P

Content-Type: application/javascript

当然,JSON 的正确 MIME 媒体类型是application/json ,但是有必要了解应用程序中期望的数据类型。

例如,我使用Ext GWT ,服务器响应必须为text / html,但包含 JSON 数据。

客户端,Ext GWT 表单侦听器

uploadForm.getForm().addListener(new FormListenerAdapter()
{
    @Override
    public void onActionFailed(Form form, int httpStatus, String responseText) 
    {
        MessageBox.alert("Error");
    }

    @Override
    public void onActionComplete(Form form, int httpStatus, String responseText) 
    {
        MessageBox.alert("Success");
    }
});

如果使用application / json响应类型,浏览器建议我保存文件。

使用Spring MVC 的服务器端源代码片段

return new AbstractUrlBasedView() 
{
    @SuppressWarnings("unchecked")
    @Override
    protected void renderMergedOutputModel(Map model, HttpServletRequest request,
                                           HttpServletResponse response) throws Exception 
    {
        response.setContentType("text/html");
        response.getWriter().write(json);
    }
};

JSON:

响应是根据 URL 中传递的查询参数动态生成的数据。

例:

{ "Name": "Foo", "Id": 1234, "Rank": 7 }

内容类型: application/json


JSON-P:

带有填充的 JSON。响应是 JSON 数据,并带有包装的函数调用。

例:

functionCall({"Name": "Foo", "Id": 1234, "Rank": 7});

内容类型: application/javascript

如果您使用的是 Ubuntu 或 Debian,并且通过 Apache 提供. json 文件,则可能需要提供具有正确内容类型的文件。我这样做主要是因为我想使用 Firefox 扩展JSONView

Apache 模块mod_mime将帮助您轻松完成此任务。但是,在 Ubuntu 中,您需要编辑/etc/mime.types文件并添加以下行

application/json json

然后重新启动 Apache:

sudo service apache2 restart

如果要从客户端调用 ASP.NET Web 服务,则必须使用application/json使其正常工作。我相信这对于jQueryExt框架是相同的。

JSON 的正确内容类型是application/json除非您使用JSONP ,也称为 JSON 与 Padding,它实际上是 JavaScript,因此正确的内容类型将是application/javascript

毫无疑问, application/json是 JSON 响应的最佳MIME类型。

但是由于一些压缩问题,我有一些必须使用application/x-javascript经验。我的托管环境是与GoDaddy共享的托管。它们不允许我更改服务器配置。我已将以下代码添加到我的web.config文件中以压缩响应。

<httpCompression>
    <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll"/>
    <dynamicTypes>
        <add mimeType="text/*" enabled="true"/>
        <add mimeType="message/*" enabled="true"/>
        <add mimeType="application/javascript" enabled="true"/>
        <add mimeType="*/*" enabled="false"/>
    </dynamicTypes>
    <staticTypes>
        <add mimeType="text/*" enabled="true"/>
        <add mimeType="message/*" enabled="true"/>
        <add mimeType="application/javascript" enabled="true"/>
        <add mimeType="*/*" enabled="false"/>
    </staticTypes>
</httpCompression>
<urlCompression doStaticCompression="true" doDynamicCompression="true"/>

通过使用此选项,.aspx 页使用 g-zip 压缩,但 JSON 响应未压缩。我加了

<add mimeType="application/json" enabled="true"/>

在静态和动态类型部分中。 但这根本不会压缩 JSON 响应。

之后,我删除了这个新添加的类型并添加了

<add mimeType="application/x-javascript" enabled="true"/>

在静态和动态类型部分中,并更改了响应类型

.ashx(异步处理程序)

application/x-javascript

现在,我发现我的 JSON 响应已使用 g-zip 压缩。所以我个人建议使用

application/x-javascript

仅当您要在共享托管环境上压缩 JSON 响应时。因为在共享主机中,它们不允许您更改IIS配置。

仅当使用application/json作为MIME类型时,我才具有以下内容(截至 2011 年 11 月,使用最新版本的 Chrome,Firefox 和Firebug ):

  • 从服务器加载 JSON 后,Chrome 将不再发出警告。
  • Firebug 将在响应中添加一个标签,向您显示格式化的 JSON 数据。如果 MIME 类型不同,它将仅显示为 “响应内容”。