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


10248

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

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

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

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

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

Answers:


10303

对于JSON文本:

application/json

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

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

application/javascript

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



我可以一起发送Json文本文件吗?
OPV

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

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

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

1616

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

当被问及为什么不这样做时text/json,Crockford似乎说JSON并不是真正的JavaScript也不是文本,而且IANA更有可能application/*比JSON分发text/*

更多资源:


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

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

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

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

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


632

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

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

463

JSON:

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

例:

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

内容类型: application/json


JSON-P:

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

例:

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

内容类型: application/javascript


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

10
JSONP也可以是分配给变量的json数据。
Jimmy Kane 2014年

401

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

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

application/json json

然后重新启动Apache:

sudo service apache2 restart

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

19
Ubuntu 12.04默认具有此功能
Prizoff 2012年

386

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


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

jQuery是能够与工作content-Type: text/plaincontent-Type: application/jsoncontent-Type: application/json; charset=UTF-8contentType: "application/x-www-form-urlencoded; charset=UTF-8"
Ashraf.Shk786

307

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


296

毫无疑问,这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配置。


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

269

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

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

244

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

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

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

请参阅Ext JS 3.4.0 API文档


40
应尽可能避免使用不符合标准的工具;application/json按规格使用。
one.beat.consumer 2012年

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

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

5
为了进一步增加的困惑:我只是在调试上三星Galaxy束(Android 2.3的)与默认浏览器类似的情况,并且iframe似乎火load事件application/javascriptapplication/x-javascripttext/javascripttext/plain,但不要烧它application/json也不是text/html。截至今天,Android <= 2.3约占Android市场份额的50%。
jakub.g 2013年

226

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

但老实说,您对MIME类型的选择是向客户端提供有关如何解释数据的建议,text/plain或者text/HTML(当不是HTML时)就像类型擦除一样,这与将所有类型为Object的对象都用一种类型的语言一样没有信息。

据我所知,没有浏览器运行时会获取JSON文档并自动将其作为JavaScript可访问对象提供给运行时,而无需干预,但是如果您使用的是残废的客户端,那就完全不同了。但是,这并不是整个故事- REST风格的 JSON服务往往没有JavaScript的运行时间,但使用JSON作为一种可行的数据交换格式它不会阻止他们。如果客户端瘫痪了...那么我可能会考虑通过Ajax模板服务进行HTML注入。

应用程序/ JSON!


210

如果您在客户端环境中,那么对于一个受良好支持的Web应用程序,必须调查跨浏览器的支持。

正确的HTTP Content-Type应该是application/json,就像其他人已经强调过的一样,但是某些客户端不能很好地处理它,这就是jQuery建议使用default的原因text/html



166

正如许多其他人所提到的,这application/json是正确的答案。

但是尚未解释的是您提出的其他选择的含义。

  • application/x-javascript:以前,JavaScript的实验性MIME类型application/javascript已成为标准。

  • text/javascript:现在已过时。application/javascript使用javascript 时应使用。

  • text/x-javascript:针对上述情况的实验性MIME类型。

  • text/x-json:JSON的实验性MIME类型在application/json正式注册之前。

总而言之,每当对内容类型有疑问时,都应检查此链接


15
什么时候text/javascript过时的?我仍在用<script type="text/javascript" ...标记填充HTML文档。
奥利(Oli)

7
确实,这对浏览器没有影响。对于RFC标准来说只是过时了:rfc-editor.org/rfc/rfc4329.txt
fcm

16
@Oli你可以放心地放下type="text/javascript",只是做<script>...</script>根据HTML5至少。
TCB13 2013年

149

JSP中,可以在page指令中使用此命令:

<%@ page language="java" contentType="application/json; charset=UTF-8"
    pageEncoding="UTF-8"%>

JSON 的正确MIME媒体类型是application/json。JSP将使用它来向客户端发送响应。


115

application/json”是正确的JSON内容类型。

def ajaxFindSystems = {
  def result = Systems.list()
  render(contentType:'application/json') {
    results {
      result.each{sys->
        system(id:sys.id, name:sys.name)
      }
    }
    resultset (rows:result.size())
  }
}

112

IANA注册application/json

使用此媒体类型的应用程序:JSON已用于以所有以下编程语言编写的应用程序之间交换数据:ActionScript,C,C#,Clojure,ColdFusion,Common Lisp,E,Erlang,Go,Java,JavaScript,Lua,Objective CAML,Perl,PHP,Python,Rebol,Ruby,Scala和Scheme。

您会注意到,IANA.org 没有列出其他任何媒体类型,实际上甚至application/javascript已经过时了。因此application/json,实际上是唯一可能的正确答案。

浏览器支持是另一回事。

支持最广泛的非标准媒体​​类型为text/jsontext/javascript。但是有些大牌甚至使用text/plain

更奇怪的是Flickr发送的Content-Type标头,后者将JSON返回为text/xml。Google使用text/javascript了一些Ajax API。

例子:

curl -I "https://ajax.googleapis.com/ajax/services/search/video?v=1.0&q=jsonexample"

输出: Content-Type: text/javascript

curl -I "https://www.flickr.com/services/rest/?method=flickr.test.echo&format=json&api_key=f82254c1491d894f1204d8408f645a93"

输出: Content-Type: text/xml


90

正确的MIME类型是 application/json

我遇到了许多情况,其中浏览器类型或框架用户需要:

text/html

application/javascript

10
这种情况的例子?
Mark Amery 2014年

75

我用下面

contentType: 'application/json',
data: JSON.stringify(SendData),

66

发布时,Content-Type标头应设置为' application / json '。侦听请求的服务器应包含“ Accept = application / json ”。在Spring MVC中,您可以这样操作:

@RequestMapping(value="location", method = RequestMethod.POST, headers = "Accept=application/json")

将标头添加到响应中:

HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");


59

application/jsonPHP中伟大的作品来存储数组或对象的数据。

我使用此代码将数据以JSON格式放置在可公开查看的Google Cloud Storage(GCS)上:

$context = stream_context_create([
    'gs' => [
        'acl'=>'public-read', 
        'Content-Type' => 'application/json',
    ]
]);

file_put_contents(
    "gs://BUCKETNAME/FILENAME.json", 
    json_encode((object) $array), 
    false, 
    $context
);

取回数据很简单:

$data = json_decode(file_get_contents("gs://BUCKETNAME/FILENAME.json"));

50

如果JSON使用填充,则将使用application/jsonp。如果JSON不带填充,它将为application/json

要同时处理这两种情况,最好使用:'application / javascript',而不必理会是使用填充还是不使用填充。


8
您的答案的第一部分是错误的。“ application / jsonp”不是有效的MIME类型。JSONP的响应主体只是JavaScript,因此必须使用JavaScript的MIME类型之一。
罗布W


43

在REST上下文中使用JSON时扩展接受的响应...

关于使用以及何时表示REST资源和集合有一个很强的论点application/x-resource+jsonapplication/x-collection+json

而且,如果您决定遵循jsonapi规范,则应使用application/vnd.api+json,因为它已被记录。

尽管还没有一个通用的标准,但是很明显,向正在传输的资源中添加的语义证明了比just 更为明确的Content-Type是正确的application/json

按照这种推理,其他上下文可以证明更具体的Content-Type是合理的。


3
application/vnd.api+json似乎专门用于使用json:api的api,这是一个非常狭窄的规范,具有自己的期望和格式,我不认为它适用于任何返回json的API。如果我错了,请指正我
Hilikus '16

42

PHP开发人员使用此命令:

<?php
    header("Content-type: application/json");

    // Do something here...
?>

39

如果您从JSON中的REST API获取数据,则必须使用content-type

For JSON data: Content-Type:application/json
For HTML data: Content-Type:text/html,
For XHTML data: Content-Type:application/xhtml+xml,
For XML data: Content-Type:text/xml, application/xml

28

Content-Type: application/json-json
Content-Type: application/javascript-json-P
Content-Type: application/x-javascript-javascript
Content-Type: text/javascript-javascript但过时,以前的IE版本曾经用作html属性。
Content-Type: text/x-javascript-JavaScript媒体类型已过时
Content-Type: text/x-json-json在application / json正式注册之前。


对于JSON文本:application / json内容类型:application / json
Vikash Chauhan

28

JSON(JavaScript对象表示法)和JSONP(“带填充的JSON”)格式似乎非常相似,因此,它们应该使用哪种MIME类型可能会非常令人困惑。即使格式相似,它们之间也存在一些细微的差异。

因此,每当有任何疑问时,我都有一个非常简单的方法(在大多数情况下效果很好),即检查相应的RFC文档。

JSON RFC 4627(JavaScript对象表示法(JSON)的application / json媒体类型)是JSON格式的规范。它在第6节中说,JSON文本的MIME媒体类型是

application/json.

JSONP 在浏览器中,JSONP(“带有填充的JSON”)与JSON的处理方式不同。JSONP被视为常规JavaScript脚本,因此它应使用application/javascript,JavaScript的当前官方MIME类型。但是,在许多情况下,text/javascriptMIME类型也可以正常工作。

请注意,RFC 4329(脚本媒体类型)文档text/javascript已将其标记为过时,建议改用type。但是,由于遗留原因,它仍然被广泛使用,并且具有跨浏览器支持(MIME类型并不总是这样,尤其是对于较旧的浏览器)。application/javascripttext/javascriptapplication/javascript

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.