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


我一直在乱搞 JSON 有一段时间,只是把它作为文本推出它并没有伤害任何人(我知道),但我想开始正确地做事。

我见过 所以 许多声称的JSON内容类型的“标准”:

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

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

我知道有类似的问题, 如果REST API返回JSON,那么MIME类型是什么?,但我想要一个稍微有针对性的答案。


9201
2018-01-25 15:25


起源




答案:


对于JSON文本:

application/json

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

对于 JSONP (runnable javascript)带回调:

application/javascript

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


9176
2018-01-25 15:27



完整的MIME类型列表 - Eugen Mihailescu
我可以将文件一起发送给Json文本吗? - OPV
它的mime类型真的很重要吗?它的文本被解析为一个对象。如果你希望它可以在没有强制下载的情况下在浏览器中打开,那么将它作为text / plain传递是不是更自然;如果你想让它自动下载,则将application / octet-stream(如果你在它上面生成它很有用)打算在本地保存的网页。是否真的有很多人需要知道mime类型,所以下载器可以使用特殊的json查看器查看它?我错过了哪些保证它是一种特殊的哑剧类型? - Dmitry
一般来说,使用“text / plain”是一种不好的做法。例如,如果您未能发送适当的MIME类型值,那么Web平台中的攻击将允许跨源数据被盗。 - EricLaw
Internet Explorer有时会出现application / json问题 - 博客处于脱机状态 - codetoshare


IANA 已将JSON的官方MIME类型注册为 application/json

当被问及为什么不 text/json,Crockford似乎已经说JSON不是真正的JavaScript也不是文本,IANA也更有可能发布 application/* 比 text/*

更多资源:


1473
2018-04-07 04:32



很多东西都投入了 text/* 在早期的部分可能会被放入 application/* 这几天这一节。 - TRiG
这是一个很大的错误imho。 JSON是文本。可以由任何文本编辑器读取/写入。知道这一点很有价值,但不能从中衍生出来 application/json。我认为拥有可以使用文本编辑器打开的所有内容会很棒 text,特定的XML文档类型 text/xml/xhtml 等......这真的有助于组织。 - Stijn de Witt
我可以打开一个 .jpg 在我的文本编辑器中。 - Rohmer
@Rohmer - 您可以“在文本编辑器中”打开任何内容,但是像JPEG或Windows .exe或.zip这样的二进制格式将包含不可打印的字符,这些字符实际上可能会破坏许多文本编辑器或导致意外行为。试试跑步 cat file.jpg 例如。而任何xml或json文件都是100%可打印的。因此,我认为Stijn de Witt的观点是有效的,尽管事实是,现在改变为时已晚。 - XP84
@ XP84您可以使用HEX格式的文本编辑器打开任何二进制文件。所有不同的角色(其中16个)都是100%可打印的。所以,按照这个逻辑...... 都是二进制文本吗?  杰森不是文字。 杰森是 (警告:未来的非正式松散定义) 对象(或对象数组)的文本表示 - xDaizu


对于JSON:

Content-Type: application/json

对于 JSON-P

Content-Type: application/javascript

786
2018-06-20 03:10



JSONP不是真正的JSON,它是一种传递JavaScript对象文字的技术 - Benjamin Gruenbaum


当然,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");
    }
});

如果使用 应用程序/ 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);
    }
};

584
2017-10-07 14:35



服务器响应必须以text / html格式显示。对于ExtJS变体也是如此。 - gbegley


JSON:

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

例:

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

内容类型:  application/json


JSON-P:

带填充的JSON。 响应是JSON数据,其中包含一个函数调用。

例:

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

内容类型:  application/javascript


427
2018-03-28 07:54



如何比上述答案更少的投票,它更完整,包含定义.. - Daniel Waters
@DanielWaters JSON的定义是错误的。它不需要动态生成或尊重查询参数。您可以提供静态JSON文件。此外,最受欢迎的答案有一个到RFC的链接。 - styfle
JSONP也可以是分配给var的json数据。 - Jimmy Kane


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

Apache模块 mod_mime 将有助于轻松做到这一点。但是,使用Ubuntu,您需要编辑该文件 /etc/mime.types 并添加该行

application/json json

然后重启Apache:

sudo service apache2 restart

372
2017-11-16 22:58



通常重新加载就足够了(比重启更快)。另外,请注意您现在可以执行“sudo service apache2 reload”。 - noamtm
Ubuntu 12.04默认使用此功能 - Prizoff


如果您从客户端调用ASP.NET Web服务,则必须使用 application/json 它的工作原理。我相信这是相同的 jQuery的 和 分机 构架。


361
2018-01-25 15:31



jQuery似乎至少与'application / json'和'text / plain'一起工作......但我还没有尝试过所有其他的。 - Nathan
jQuery能够使用 content-Type: text/plain, content-Type: application/json, content-Type: application/json; charset=UTF-8, contentType: "application/x-www-form-urlencoded; charset=UTF-8" - Ashraf.Shk786


JSON的正确内容类型是 application/json除非你正在使用 JSONP,也称为带填充的JSON,实际上是JavaScript,所以正确的内容类型 application/javascript


287
2018-04-12 04:00





这点毋庸置疑 application/json 是最好的 哑剧 输入JSON响应。

但我有一些经验,我不得不使用 application/x-javascript 因为一些压缩问题。我的托管环境是共享托管 去吧爸爸。他们不允许我更改服务器配置。我已将以下代码添加到我的 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

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


277
2018-04-18 08:22



“所以我个人建议使用application / x-javascript”这个答案会让人误解。去吧爸爸 不 允许压缩 application/json,我在我的共享主机上利用它,我不建议使用不同的内容类型来启用压缩,这是完全错误的。它可以做到,但它仍然是错的。使用不同的内容类型 浏览器支持 是一回事,使用不同的内容类型进行服务器端压缩是另一回事。 - Lady Bird