it-swarm.cn

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

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

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

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

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

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

9670
Oli

对于JSON文本:

application/json

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

对于带有回调的 _ jsonp _ (runnable javascript):

application/javascript

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

9674
Gumbo

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

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

更多资源:

1557
gnrfan

对于JSON:

Content-Type: application/json

对于 JSON-P

Content-Type: application/javascript
833
Alix Axel

当然,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 response类型,浏览器建议我保存文件。

服务器端源代码片段使用 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);
    }
};
610
Mikhail.Mamaev

JSON:

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

示例:

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

Content-Type: application/json


JSON-P:

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

示例:

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

Content-Type: application/javascript

452
Bhavin

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

Apache模块 mod_mime 将有助于轻松完成此任务。但是,使用Ubuntu你需要编辑文件 /etc/mime.types 并添加行

application/json json

然后重启Apache:

Sudo service Apache2 restart
387
Gourneau

如果您从客户端调用ASP.NET Web服务,则必须使用application/json才能使用它。我相信 jQueryExt frameworks也是如此。

372
markvpc

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

296
Resist Design

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

285
shashwat

只有当使用application/json作为 _ mime _ type我才有以下内容(截至2011年11月,最新版本的Chrome,Firefox带 Firebug ):

  • 从服务器加载JSON时,Chrome不再发出警告。
  • Firebug将在响应中添加一个选项卡,显示格式化的JSON数据。如果MIME类型不同,它将显示为“响应内容”。
259
Ivo Limmen

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

如果你使用 Ext JS form submit来上传文件,请注意浏览器会解析服务器响应以创建<iframe>的文档。

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

请参阅 Ext JS 3.4.0 API文档

234
Conan

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

但老实说,你对MIME类型的选择是建议客户端如何解释数据text/plaintext/HTML(当它不是HTML时)就像类型擦除一样 - 它与使用类型语言制作所有Object类型的对象一样无法提供信息。 。

我所知道的浏览器运行时没有采用JSON文档并自动将其作为JavaScript可访问对象提供给运行时而无需干预,但如果您正在使用残缺客户端,那就完全不同了。但这不是整个故事 - RESTful JSON服务通常没有JavaScript运行时,但它并没有阻止它们使用JSON作为可行的数据交换格式。如果客户端瘫痪...那么我会考虑通过 Ajax templating服务来注入HTML。

应用程序/ JSON!

219
VLostBoy

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

正确的HTTP Content-Type将是application/json,因为其他人已经突出显示,但是有些客户端不能很好地处理它,这就是jQuery推荐默认text/html的原因。

203
Emanuele Del Grande

正确答案是:

Content-Type: application/json
161
Irfan DANISH

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

但尚未解释的是你提出的其他选择意味着什么。

  • application/x-javascript:在application/javascript标准之前,JavaScript的实验MIME类型。

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

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

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

总而言之,无论何时您对内容类型有任何疑问,都应该检查 此链接

158
fcm

_ jsp _ 中,您可以在page指令中使用它:

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

JSON的正确 _ mime _ media类型是application/json。 JSP将使用它向客户端发送响应。

141
raja

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())
  }
}
109
Sukane

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 apis。

例子:

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

101
Jhawins

正确的MIME类型是application/json

_但_

我经历过浏览器类型或框架用户所需的许多情况:

text/html

application/javascript
84
LombaX

我用下面的

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

发布时, 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");
63
Alexander Burakevych

Spring 你有一个定义的类型:MediaType.APPLICATION_JSON_VALUE,相当于 application/json

56
Chand Priyankara

application/json在PHP中运行良好,可存储数组或对象数据。

我使用此代码将数据放在JSON上 Google云端存储(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"));
56
Chetabahana

对于JSON,我正在使用:

 Content-Type: application/json

这在IETF的JSON数据交换格式7158提议中描述, 第1.2节:JSON的规范

48
Mehmet_

如果JSON带有填充,那么它将是application/jsonp。如果JSON没有填充,那么它将是application/json

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

48
Ankit Zalani

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

当你表示REST资源和集合时,有一个 强参数 关于使用application/x-resource+jsonapplication/x-collection+json

如果您决定遵循 jsonapi specification, 您应该 使用application/vnd.api+json,因为它已被记录。

尽管没有一个通用的标准,很明显,对于被转移的资源添加的语义证明了更明确的Content-Type而不仅仅是application/json

根据这个推理,其他上下文可以证明更具体的Content-Type

41
jgomo3

PHP开发人员使用这个:

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

    // Do something here...
?>
40
user3087089

如果从JSON中的REST AP​​I获取数据,则必须使用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
38
Krishna

_ json _ (JavaScript Object Notation)和 _ jsonp _ (“带有填充的JSON”)格式似乎非常相似,因此它们应该使用哪种MIME类型可能会非常混乱。尽管格式相似,但它们之间存在一些细微差别。

因此,无论何时怀疑,我都有一个非常简单的方法(在大多数情况下都可以正常工作),即去检查相应的RFC文档。

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

application/json.

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

请注意text/javascript已被 RFC 4329 (脚本媒体类型)文档标记为已过时,建议使用application/javascript类型。但是,由于遗留原因,text/javascript仍然被广泛使用,并且它具有跨浏览器支持(对于application/javascript MIME类型并不总是如此,特别是对于旧版浏览器)。

24
Iresha Rubasinghe

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在申请/ json正式注册之前。

23
Kashif Solangi

要指定有趣的JSON结果,请在请求标头中添加“application/json”,如下所示:

“Accept:application/json”是一种理想的响应格式。

“Content-Type:application/json”指定请求的内容格式,但有时您同时指定application/jsonapplication/xml,但这些质量可能会有所不同。哪个服务器将发回不同的响应格式,请看示例:

Accept:application/json;q=0.4,application/xml;q=8

这将返回XML,因为XML具有更高的质量。

6
behzad babaei

适当的当前标准是application/json。虽然默认编码是UTF-8,但值得一提的是它也可以是UTF-16或utf-32。当JSON以UTF-16或UTF-32编写时,必须使用二进制内容传输编码。

这里有关于json的更多信息: https://tools.ietf.org/html/rfc4627

有关二进制传输编码的更多信息,请访问: https://www.w3.org/Protocols/rfc1341/5_Content-Transfer-Encoding.html

5
sammyb123

为了补充其余的答案,JSON链接数据的MIME类型(JSON-LD) 根据W3C 是:

application/ld+json

输入名称: application

子类型名称: ld + json

另外,来自同一来源:

文件扩展名

.jsonld

5
alejnavab

即使有 许多内容类型 总是尝试记住这三种内容类型。因为你可能不得不经常使用这些。

  • Content-Type:application/json
  • Content-Type:application/xml
  • 内容类型:text/html
1
cherankrish