11086

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

我已经看到许多声称的 JSON 内容类型的“标准”:

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

但是哪一个是正确的,还是最好的?我收集到它们之间存在不同的安全和浏览器支持问题。

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

4

37 回答 37

11159

对于 JSON 文本:

application/json

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

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

application/javascript

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

于 2009-01-25T15:27:29.720 回答
1737

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

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

更多资源:

于 2010-04-07T04:32:55.107 回答
974

对于 JSON:

Content-Type: application/json

对于JSON-P

Content-Type: application/javascript
于 2012-06-20T03:10:53.043 回答
671

当然,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);
    }
};
于 2009-10-07T14:35:36.313 回答
492

JSON:

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

例子:

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

内容类型: application/json


JSON-P:

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

例子:

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

内容类型: application/javascript

于 2013-03-28T07:54:24.180 回答
424

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

Apache 模块mod_mime将有助于轻松完成此操作。但是,对于 Ubuntu,您需要编辑文件/etc/mime.types并添加该行

application/json json

然后重启 Apache:

sudo service apache2 restart
于 2010-11-16T22:58:25.013 回答
406

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

于 2009-01-25T15:31:38.807 回答
321

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

于 2012-04-12T04:00:37.183 回答
311

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

于 2012-04-18T08:22:23.807 回答
275

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

  • 从服务器加载 JSON 时,Chrome 不再发出警告。
  • Firebug 将在响应中添加一个选项卡,向您显示格式化的 JSON 数据。如果 MIME 类型不同,它只会显示为“响应内容”。
于 2011-11-30T06:42:21.580 回答
251

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

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

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

请参阅Ext JS 3.4.0 API 文档

于 2011-09-07T02:41:00.140 回答
234

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

但老实说,您选择的 MIME 类型是对客户如何解释数据的建议——text/plain或者text/HTML(当它不是 HTML 时)就像类型擦除一样——它与将所有对象类型的对象都用类型化语言制作一样没有信息。

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

应用程序/JSON!

于 2012-05-14T22:19:48.547 回答
215

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

正确的 HTTP Content-Type 应该是application/json,正如其他人已经强调的那样,但是有些客户端不能很好地处理它,这就是 jQuery 推荐默认值的原因text/html

于 2012-04-27T16:27:29.280 回答
180

正确答案是:

Content-Type: application/json
于 2012-12-31T06:29:16.963 回答
175

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

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

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

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

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

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

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

于 2013-04-02T11:10:56.707 回答
157

JSP中,您可以在页面指令中使用它:

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

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

于 2013-01-19T08:22:22.890 回答
121

“<code>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())
  }
}
于 2013-02-26T11:55:27.980 回答
120

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. 谷歌使用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

于 2014-02-12T16:12:34.547 回答
94

正确的 MIME 类型是application/json

我经历了很多浏览器类型或框架用户需要的情况:

text/html

application/javascript
于 2013-05-03T16:00:28.960 回答
78

我使用以下

contentType: 'application/json',
data: JSON.stringify(SendData),
于 2013-05-16T12:43:52.970 回答
69

发布时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");
于 2013-08-09T10:49:18.707 回答
62

application/json在 PHP 中存储数组或对象数据的效果很好。

我使用此代码将数据以 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"));
于 2015-04-01T16:13:44.210 回答
60

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

于 2013-06-29T08:34:53.100 回答
55

对于 JSON,我正在使用:

Content-Type: application/json

这在 IETF 的 JSON 数据交换格式 7158 提案第 1.2 节:JSON 规范中进行了描述

于 2015-02-06T12:01:14.770 回答
52

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

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

于 2013-06-21T15:22:12.830 回答
51
  • Content-Type: application/json- JSON
  • Content-Type: application/javascript- JSON-P
  • Content-Type: application/x-javascript- JavaScript
  • Content-Type: text/javascript- JavaScript已过时。旧的 Internet Explorer 版本用于将其用于 HTML 属性。
  • Content-Type: text/x-javascript- JavaScript 媒体类型,已过时
  • Content-Type: text/x-json-应用程序/json正式注册之前的 JSON。
于 2017-08-08T03:49:59.413 回答
47

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

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

如果您决定遵循jsonapi规范,您应该使用 of application/vnd.api+json,因为它已记录在案。

尽管没有通用标准,但很明显,为正在传输的资源添加的语义证明了application/json.

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

于 2015-06-09T19:12:56.680 回答
46

PHP 开发人员使用这个:

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

    // Do something here...
?>
于 2014-03-29T05:43:05.133 回答
46

如果您以 JSON 格式从 REST API 获取数据,则必须使用Content-Type

  • 对于 JSON 数据:Content-Type:application/json
  • 对于 HTML 数据:Content-Type:text/html
  • 对于 XHTML 数据:Content-Type:application/xhtml+xml
  • 对于 XML 数据:Content-Type:text/xml, application/xml
于 2016-04-11T09:15:26.297 回答
33

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

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

JSON RFC 4627 (The application/json Media Type for JavaScript Object Notation (JSON)) 是 JSON 格式的规范。它在第 6 节中说,JSON 文本的 MIME 媒体类型是

application/json.

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

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

于 2016-02-15T03:20:43.267 回答
12

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

application/ld+json

类型名称:应用程序

子类型名称: ld+json

此外,来自同一来源:

文件扩展名

.jsonld

于 2017-01-03T22:15:21.763 回答
12

由于您可能需要更频繁地使用这些内容,因此即使有很多内容类型,也请始终尝试记住这三种内容类型

  • 内容类型:应用程序/json
  • 内容类型:应用程序/xml
  • 内容类型:文本/html
于 2019-04-08T20:37:39.963 回答
11

要指定有趣的 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 具有更高的质量。

于 2016-09-04T10:21:20.690 回答
11

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

RFC 4627中有关于 JSON 的更多信息:JavaScript Object Notation (JSON) 的 application/json 媒体类型

有关二进制传输编码的更多信息,请参见5. Content-Transfer-Encoding Header Field (RFC 1341)。

于 2016-10-17T21:40:46.053 回答
7

作为一些研究,

最常见的 MIME 类型是

应用程序/json

让我们看一个区分 JSON 和 JavaScript 的示例。

  • 应用程序/json

当不知道如何使用这些数据时使用它。当信息只是以 JSON 格式从服务器中提取时,它可能是通过链接或从任何文件中提取的,在这种情况下,它会被使用。

例如-

<?php

    header('Content-type:application/json');

    $directory = [
            ['Id' => 1, 'Name' => 'this'],
            ['Id' => 2, 'Name' => 'is'],
            ['Id' => 3, 'Name' => 'Stack Overflow'],
        ];

    // Showing the JSON data

    echo json_encode($directory);
?>

输出是,

[{"Id":1, "Name":"this"}, {"Id":2, "Name":"is"}, {"Id":3, "Name":"Stack Overflow"}]

  • 应用程序/javascript

它在预定义数据的使用时使用。它由客户端 Ajax 应用程序调用的应用程序使用。当数据是 JSON-P 或JSONP类型时使用它。

例如

<?php

    header('Content-type:application/javascript');

    $dir = [
            ['Id' => 1, 'Name' => 'this' ],
            ['Id' => 2, 'Name' => 'is'],
            ['Id' => 3, 'Name' => 'Stack Overflow'],
    ];

    echo "Function_call(" . json_encode($dir) . ");";
?>

输出是,

Function_call([{"Id":1, "Name":"this"}, {"Id":2, "Name":"is"}, {"Id":3, "Name":"Stack Overflow"}])

对于其他 MIME 类型,请参阅MIME 类型(IANA 媒体类型)中的完整详细信息。

于 2020-12-13T07:50:41.267 回答
4

你的问题的一部分与我有关,因为我刚刚遇到它。

第三方提供商正在提供可供多个客户端使用的 REST 服务。它是一个简单的 REST,使用返回格式良好的 JSON 的查询参数调用。我已经用 PHP 和 Java 对其进行了测试,它按预期工作。

我的客户使用 Oracle Service Bus 作为其应用程序服务器和 Internet 之间的网关。当我创建 OSB 服务时,它因Invalid message format错误而崩溃。原来content-type被退回的是text/html. OSB 按照此标头处理响应;在文本、XML 和 JSON 之间进行转换。在这种情况下,响应是 JSON,但标头没有说明。联系提供商,我得到了答复:“我们不会更改它,因为它不会影响其他任何人”。

Content-Type头指定内容应该是什么,而不是它实际上是什么。也就是说,在您的消费程序中,是否检查或忽略它并以任何方式处理内容取决于您。另一个例子,您可以返回 GIF 数据,但将内容类型指定为 JSON,然后继续忽略标头并读取图像数据。这不会伤害您的程序,但可能会伤害其他人。

故事的寓意:玩得好。

于 2019-11-29T05:17:54.373 回答
0

这取决于观点。

如果您是发送请求的客户端,那么application/json是正确的选择。

但是如果你是接收请求的服务器,你必须做好准备,客户端也可能发送编码。所以application/jsonapplication/json; charset=utf-8是有效的。

两种情况下的媒体类型相同。但内容类型不同。

于 2022-03-02T14:18:17.377 回答