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

json

JSON 内容类型有许多“标准”:

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

哪个最好?我认为安全和浏览器支持问题是一个因素。

相关:What MIME type if JSON is being returned by a REST API?

R
Roshana Pitigala

对于 JSON 文本:

application/json

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

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

application/javascript

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

为什么不应该对 JSON 使用 text/html

Internet Explorer 有时会出现 application/json 问题

一个相当完整的 Mimetype 列表以及它们的用途

IANA 的官方 mime 类型列表来自 @gnrfan 下面的回答

Complete list of MIME types

它有什么 mime 类型真的很重要吗?它是被解析为对象的文本。如果您希望它可以在浏览器中打开而无需强制下载,将它作为 text/plain 传递,如果您希望自动下载它,将它传递为 application/octet-stream 会不会更自然(如果您在生成它时很有用打算保存在本地的网页)。真的有那么多人需要知道 mime 类型以便下载者可以使用特殊的 json 查看器查看它吗?我错过了什么保证它是一种特殊的哑剧类型?

Internet Explorer 有时会出现应用程序/json 问题 - 博客已离线

想象一下,我有一份由某人编写的包含纯文本的文档。现在,纯文本恰好也是有效的 JSON。那么我使用 text/plain 作为它的 mime 类型会是错误的吗? JSON 是文本的 SUB-TYPE。所以我认为两者都应该被允许。问题是哪个在实践中效果更好。根据 codetoshare 的评论,IE 的 application/json 有问题。但是任何浏览器都不应该有文本/纯文本问题。如果 text/plain 不安全,那么如何从我的网站提供文本文件?

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

G
Gowtham Subramaniam

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

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

更多资源:

媒体类型

征求意见 4627

bluesmoon:JSON 有一个类型

很多东西在早期被放入 text/* 部分,而现在可能会被放入 application/* 部分。

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

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

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

我倾向于同意 Stijn de Witt 的观点。 JSON 旨在使用文本编辑器进行查看和编辑。

A
Amal Murali

对于 JSON:

Content-Type: application/json

对于 JSON-P

Content-Type: application/javascript

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

J
John Odom

当然,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 变体也是如此。

U
User 1531343

JSON:

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

例子:

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

内容类型: application/json

JSON-P:

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

例子:

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

内容类型: application/javascript

JSON的定义是错误的。它不需要动态生成或尊重查询参数。您可以提供静态 JSON 文件。此外,最受好评的答案有一个指向 RFC 的链接。

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

U
Umpa

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

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

application/json json

然后重启 Apache:

sudo service apache2 restart

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

Ubuntu 12.04 默认有这个

A
Amal Murali

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

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"

A
Amal Murali

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

A
A J A Y

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

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

M
Michael Berkowski

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

从服务器加载 JSON 时,Chrome 不再发出警告。

Firebug 将在响应中添加一个选项卡,向您显示格式化的 JSON 数据。如果 MIME 类型不同,它只会显示为“响应内容”。

t
tagurit

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

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

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

请参阅the Ext JS 3.4.0 API documentation

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

@one.beat.consumer 虽然这是真的,但它并不特定于 ExtJs 本身。这是浏览器的限制(或者更确切地说,也许是一种“安全措施”)。

当然使用 text/plain 会更好,因此它不会将任何 HTML 语义应用于非 HTML 内容?或者如果没有 DOM,浏览器是否让您提取框架的内容?

进一步混淆:我只是在使用默认浏览器的三星 Galaxy Beam (Android 2.3) 上调试一个类似的案例,iframe 似乎触发了 application/javascriptapplication/x-javascripttext/javascriptload 事件, text/plain,但 NOTapplication/jsontext/html 触发它。截至今天,Android <=2.3 约占 Android 市场份额的 50%。

d
djv

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

但老实说,您选择的 MIME 类型是对客户如何解释数据的建议 - text/plaintext/HTML(当它不是 HTML 时)就像类型擦除 - 它与将所有对象都设为 Object 类型一样没有信息用打字的语言。

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

应用程序/JSON!

y
yodabar

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

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

P
Peter Mortensen

正确答案是:

Content-Type: application/json
f
fcm

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

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

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

文本/javascript:现在已过时。使用 javascript 时应使用 application/javascript。

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

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

总而言之,每当您对内容类型有任何疑问时,都应该检查 this link

text/javascript 什么时候过时了?我仍在用 <script type="text/javascript" ... 标记填充 HTML 文档。

真的,它对浏览器没有任何影响。它只是过时的 RFC 标准:rfc-editor.org/rfc/rfc4329.txt

@Oli 您可以安全地删除 type="text/javascript" 并至少根据 HTML5 执行 <script>...</script>

r
raja

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

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

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

G
George Stocker

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())
  }
}
佚名

IANA registration for 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 doesn't list any of these other media types,实际上甚至 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

G
George Stocker

正确的 MIME 类型是 application/json

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

text/html

application/javascript

这种情况的例子?

D
DD_

我使用以下

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

发布时,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");
N
Nubok

application/json 在 PHP 中可以很好地存储数组或对象数据。

我使用此代码将数据放在设置为 publically viewableGoogle Cloud Storage (GCS) 上的 JSON 中:

$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"));
P
Peter Mortensen

内容类型:应用程序/json - JSON

内容类型:应用程序/javascript - JSON-P

内容类型:application/x-javascript - JavaScript

Content-Type: text/javascript - JavaScript 但已过时。旧的 Internet Explorer 版本用于将其用于 HTML 属性。

Content-Type: text/x-javascript - JavaScript 媒体类型,但已过时

Content-Type: text/x-json - application/json 正式注册之前的 JSON。

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

P
Peter Mortensen

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

这也是 Java EE:: javax.ws.rs.core.MediaType

P
Peter Mortensen

对于 JSON,我正在使用:

Content-Type: application/json

这在 IETF 的 JSON 数据交换格式 7158 提案 Section 1.2: Specifications of JSON 中有所描述。

P
Peter Mortensen

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

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

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

3
3 revs, 2 users 96%

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

当您表示 REST 资源和集合时,有一个关于使用 application/x-resource+jsonapplication/x-collection+jsonstrong argument

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

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

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

application/vnd.api+json 似乎专门用于使用 json:api 的 api,这是一个非常狭窄的规范,有自己的期望和格式,我不明白它适用于返回 json 的 any API。如果我错了请纠正我

P
Peter Mortensen

如果您以 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

P
Peter Mortensen

PHP 开发人员使用这个:

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

    // Do something here...
?>
P
Prajwal

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

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

JSON RFC 4627(JavaScript Object Notation (JSON) 的 application/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 类型并不总是这样,尤其是在旧浏览器中)。