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

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

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


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

我知道还有一个类似的问题,如果REST API返回JSON,则是什么MIME类型?更有针对性的答案。

#1 楼

对于JSON文本:
application/json

JSON文本的MIME媒体类型为application/json。默认编码为UTF-8。 (来源:RFC 4627)。对于带有回调的JSONP(可运行的JavaScript):
application/javascript
以下是在相关注释中提到的一些博客文章:

为什么不应该将text/html用于JSON
Internet Explorer有时会出现application/json问题
一个相当完整的Mimetypes列表以及将其用于什么

官方来自@gnrfan的以下答案在IANA上的mime类型列表


评论


MIME类型的完整列表

– Eugen Mihailescu
17-4-4在5:08



它的哑剧类型真的重要吗?它是被解析为对象的文本。如果您希望它可以在浏览器中打开而无需强制下载,而将它作为文本/纯文本传递会更自然,而如果您希望它被自动下载,则将其作为应用程序/八位字节流(如果在打算保存在本地的网页)。确实有很多人需要知道mime类型,以便下载程序可以使用特殊的json查看器进行查看吗?我缺少什么使它具有特殊的mime类型?

–德米特里
17年8月23日12:00



Internet Explorer有时与application / json有关-博客离线

– Kudlatiger
18年6月4日在3:59

想象一下,我有一个人写的文档,其中包含纯文本。现在,纯文本也恰好也是有效的JSON。那么将text / plain用作其mime类型会错吗? JSON是文本的子类型。因此,我认为两者都应允许。问题是在实践中哪种效果更好。根据codetoshare的评论,IE的application / json存在问题。但是,任何浏览器都不会出现文本/纯文本问题。如果文本/纯文本不安全,那么如何从我的网站提供文本文件?

– Panu Logic
'18 Sep 1'在16:08

@EugenMihailescu该页面的标题是“ MIME类型的不完整列表”

– Omegastick
19年8月30日在6:30

#2 楼

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

更多资源:


媒体类型
征求评论意见4627
bluesmoon:JSON具有类型


评论


早期,很多东西被放到了text / *部分中,而这些天可能会被放到application / *部分中。

– TRiG
2011年7月5日在20:47

@Rohmer-您可以“打开”文本编辑器中的任何内容,但是JPEG或Windows .exe或.zip之类的二进制格式将包含不可打印的字符,这些字符实际上会破坏许多文本编辑器或导致不良行为。例如,尝试运行cat file.jpg。而任何xml或json文件都是100%可打印的。因此,我认为Stijn de Witt的观点是正确的,尽管事实是,现在改变现在为时已晚。

– XP84
18年1月16日在20:59

@ XP84您可以使用十六进制格式的文本编辑器打开任何二进制文件。并且所有不同的字符(其中的16个)都是100%可打印的。那么,按照这种逻辑...二进制文件都是文本吗? Json不是文字。 Json(警告:前面是非正式的松散定义)是对象(或对象数组)的文本表示形式

–xDaizu
18-4-5在11:55



短语“十六进制格式的文本编辑器”没有意义。十六进制编辑器将每个字节显示为其十六进制值,例如,将字节1111000显示为“ 78”。尽管可能有一些文本编辑器也碰巧具有十六进制编辑模式,但是这对除了技术含量最高的用户执行最高技术任务之外的任何事情来说,都是既不通用也不有用的。相比之下,文本表示ASCII或Unicode,而在文本中,字节1111000表示小写的x字符。不是78。JSON是与HTML(text / html)完全相同的文本。它仅包含可读的文本字符,其中包含结构化含义。

– XP84
18年5月21日在21:53

我倾向于同意Stijn de Witt。 JSON旨在通过文本编辑器进行查看和编辑。

– Panu Logic
'18 Sep 1'在15:59



#3 楼

对于JSON:



 Content-Type: application/json
 


对于JSON-P:

 Content-Type: application/javascript
 


评论


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

–本杰明·格伦鲍姆(Benjamin Gruenbaum)
2013年9月8日在6:44



#4 楼

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


评论


服务器响应必须为text / html。 ExtJS变体也是如此。

– gbegley
2012年10月30日在21:10

#5 楼

JSON:

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

示例:

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


Content-Type:application/json


JSON-P:

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

示例:

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


内容类型:application/javascript

评论


JSON的定义是错误的。它不需要动态生成或遵守查询参数。您可以提供静态JSON文件。同样,最受支持的答案具有指向RFC的链接。

–styfle
2014年1月29日在1:37



JSONP也可以是分配给变量的json数据。

–吉米·凯恩(Jimmy Kane)
2014年1月30日13:16

#6 楼

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

Apache模块mod_mime将有助于轻松实现此目的。但是,对于Ubuntu,您需要编辑文件/etc/mime.types并添加以下行

application/json json


然后重新启动Apache:

评论


通常,重新加载就足够了(比重新启动更快)。另外,请注意,您现在可以执行“ sudo service apache2 reload”。

– noamtm
2011年1月19日17:37

Ubuntu 12.04默认具有此功能

– Prizoff
2012年5月25日17:52

#7 楼

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

评论


jQuery似乎至少可以与'application / json'和'text / plain'一起使用...尽管我没有尝试过所有其他工具。

–内森(Nathan)
10 Mar 18 '10在19:30

jQuery能够使用content-Type:文本/纯文本,content-Type:应用程序/ json,content-Type:应用程序/ json; charset = UTF-8,contentType:“应用程序/ x-www-form-urlencoded; charset = UTF-8”

–Ashraf.Shk786
17年7月27日在11:13

#8 楼

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

#9 楼

毫无疑问,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压缩。因此,我个人建议仅在要在共享托管环境上压缩JSON响应的情况下使用

application/x-javascript


。因为在共享主机中,它们不允许您更改IIS配置。

评论


“因此,我个人建议使用application / x-javascript”是此答案引起误解的地方。 GoDaddy确实允许压缩application / json,我在共享主机上利用了它,我也不建议使用其他内容类型来启用压缩,这是错误的。可以做到,但仍然是错误的。为浏览器支持使用不同的内容类型是一回事,为服务器端压缩使用不同的内容类型是另一回事。

–user1596138
2014-12-11 16:20



#10 楼

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


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


#11 楼

并非所有内容都适用于application/json内容类型。

如果您使用Ext JS表单提交上传文件,请注意,浏览器会解析服务器响应以为<iframe>创建文档。

如果服务器使用JSON发送返回对象,则必须将Content-Type标头设置为text/html,以告知浏览器将未更改的文本插入文档正文中。

请参阅Ext JS 3.4.0 API文档。

评论


应尽可能避免使用不符合标准的工具。根据规格使用application / json。

–one.beat.consumer
2012年2月16日在2:05

@ one.beat.consumer确实如此,但它本身并不特定于ExtJ。这是浏览器的限制(或者,也许是“安全措施”)。

–亨拉·爱侣湾(Hendy Irawan)
2012年2月24日15:54

当然,最好使用文本/纯文本,这样它就不会对非HTML内容应用任何HTML语义?还是如果没有DOM,浏览器就不会让您提取框架的内容吗?

–同步
2012年8月10日12:34

进一步说明,我正在使用默认浏览器在Samsung Galaxy Beam(Android 2.3)上调试类似的案例,并且iframe似乎触发了application / javascript,application / x-javascript,text / javascript,text /普通,但不针对application / json或text / html触发它。截至今天,Android <= 2.3约占Android市场份额的50%。

–jakub.g
13年5月5日在12:41



#12 楼

JSON是一种域专用语言(DSL)和一种独立于JavaScript的数据格式,因此具有自己的MIME类型application/json。对MIME类型的尊重当然是由客户端驱动的,因此text/plain可以用于传输字节,但随后您将不必要地将解释推向供应商应用程序域-application/json。您会通过text/plain传输XML吗?

我所知道的浏览器运行时不会获取JSON文档,并且无需干预即可自动将其作为JavaScript可访问对象提供给运行时,但是如果您与残缺的客户合作,那将是另一回事。但这还不是全部。RESTful JSON服务通常没有JavaScript运行时,但是并不能阻止使用JSON作为可行的数据交换格式。如果客户端瘫痪了,那我可能会考虑通过Ajax模板服务进行HTML注入。

Application / JSON!

#13 楼

如果您在客户端环境中,那么对于一个受良好支持的Web应用程序,必须进行跨浏览器支持的调查。 ,但是某些客户端不能很好地处理它,因此jQuery建议使用默认的application/json

#14 楼

正确答案是:

Content-Type: application/json


#15 楼

正如许多其他人提到的那样,application/json是正确的答案。 :在将application/x-javascript设置为标准之前,用于JavaScript的实验性MIME类型。
application/javascript:现在已过时。使用javascript时应使用text/javascript
application/javascript:用于上述情况的实验MIME类型。
text/x-javascript:在text/x-json正式注册之前,JSON的实验MIME类型。 ,如果您对内容类型有任何疑问,应检查此链接

评论


文字/ javascript什么时候过时的?我仍在用