提问人:Oli 提问时间:1/25/2009 最后编辑:SuperStormerOli 更新时间:7/29/2023 访问量:3822529
我应该使用哪种 JSON 内容类型?
Which JSON content type do I use?
问:
JSON 内容类型有许多“标准”:
application/json
application/x-javascript
text/javascript
text/x-javascript
text/x-json
我应该使用哪一个,在哪里使用?我认为安全和浏览器支持问题是一个因素。
答:
对于 JSON 文本:
application/json
JSON 文本的 MIME 媒体类型为 .默认编码为 UTF-8。(来源:RFC 4627)
application/json
对于带有回调的 JSONP(可运行的 JavaScript):
application/javascript
以下是相关评论中提到的一些博客文章:
- 为什么不应该对
JSON 使用 text/html
- Internet Explorer 有时会出现
application/json
问题 - 一个相当完整的 Mimetypes 列表以及它们的用途
- IANA 的官方哑剧类型列表来自下面 @gnrfan 的回答
评论
如果要从客户端调用 ASP.NET Web 服务,则必须使用它才能正常工作。我相信这对于 jQuery 和 Ext 框架是一样的。application/json
评论
content-Type: text/plain
content-Type: application/json
content-Type: application/json; charset=UTF-8
contentType: "application/x-www-form-urlencoded; charset=UTF-8"
当然,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);
}
};
评论
IANA 已将 JSON 的官方 MIME 类型注册为 application/json
。
当被问及为什么不这样做时,Crockford似乎说JSON不是真正的JavaScript,也不是文本,而且IANA更有可能分发。text/json
application/*
text/*
更多资源:
评论
text/*
application/*
cat file.jpg
x
如果您使用的是 Ubuntu 或 Debian,并且通过 Apache 提供.json文件,则可能需要使用正确的内容类型提供文件。我这样做主要是因为我想使用 Firefox 扩展 JSONView
Apache 模块mod_mime将有助于轻松做到这一点。但是,在 Ubuntu 中,您需要编辑文件 /etc/mime.types 并添加以下行
application/json json
然后重新启动 Apache:
sudo service apache2 restart
评论
并非一切都适用于内容类型。application/json
如果您使用 Ext JS 表单提交上传文件,请注意,服务器响应由浏览器解析,以便为 .<iframe>
如果服务器使用 JSON 发送返回对象,则必须将标头设置为 ,以便告诉浏览器将文本原封不动地插入到文档正文中。Content-Type
text/html
请参阅 Ext JS 3.4.0 API 文档。
评论
application/json
iframe
load
application/javascript
application/x-javascript
text/javascript
text/plain
application/json
text/html
仅当用作MIME类型时,我才具有以下内容(截至2011年11月,使用最新版本的Chrome,Firefox和Firebug):application/json
- 从服务器加载 JSON 时,Chrome 不再发出警告。
- Firebug 将在响应中添加一个选项卡,显示 JSON 数据 格式 化。如果 MIME 类型不同,它只会显示为 “响应内容”。
JSON 的正确内容类型是 除非您使用的是 JSONP,也称为带填充的 JSON,它实际上是 JavaScript,因此正确的内容类型是 .application/json
application/javascript
毫无疑问,这是 JSON 响应的最佳 MIME 类型。application/json
但是我有一些经验,由于一些压缩问题,我不得不使用。我的托管环境是与 GoDaddy 共享托管的。它们不允许我更改服务器配置。我已将以下代码添加到我的文件中以压缩响应。application/x-javascript
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/json
如果处于客户端环境中,则对于受良好支持的 Web 应用程序,必须调查跨浏览器支持。
正确的 HTTP Content-Type 将是 ,正如其他人已经强调的那样,但有些客户端不能很好地处理它,这就是为什么 jQuery 推荐默认 .application/json
text/html
JSON 是一种域特定语言 (DSL) 和独立于 JavaScript 的数据格式,因此具有自己的 MIME 类型。当然,对 MIME 类型的尊重是客户端驱动的,因此可能会用于字节的传输,但这样一来,您就会不必要地将解释推高到供应商应用程序域 - 。你会通过以下方式传输 XML 吗?application/json
text/plain
application/json
text/plain
但老实说,你对MIME类型的选择是向客户建议如何解释数据 - 或者(当它不是HTML时)就像类型擦除一样 - 它就像在类型化语言中使所有对象都是Object类型一样没有信息。text/plain
text/HTML
据我所知,没有一个浏览器运行时会接受 JSON 文档并自动将其作为 JavaScript 可访问对象提供给运行时,而无需干预,但如果您使用的是瘫痪的客户端,那就完全不同了。但这还不是全部 - RESTful JSON 服务通常没有 JavaScript 运行时,但这并不能阻止它们使用 JSON 作为可行的数据交换格式。如果客户那么残废......那么我会考虑通过 Ajax 模板服务进行 HTML 注入。
应用程序/JSON!
对于 JSON:
Content-Type: application/json
对于 JSON-P:
Content-Type: application/javascript
评论
正确答案是:
Content-Type: application/json
在 JSP 中,您可以在 page 指令中使用以下命令:
<%@ page language="java" contentType="application/json; charset=UTF-8"
pageEncoding="UTF-8"%>
JSON 的正确 MIME 媒体类型是 。JSP 将使用它向客户端发送响应。application/json
“” 是正确的 JSON 内容类型。application/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())
}
}
JSON格式:
响应是根据 URL 中传递的查询参数动态生成的数据。
例:
{ "Name": "Foo", "Id": 1234, "Rank": 7 }
内容类型: application/json
JSON-P格式:
带填充的 JSON。 响应是 JSON 数据,并围绕它进行函数调用。
例:
functionCall({"Name": "Foo", "Id": 1234, "Rank": 7});
内容类型: application/javascript
评论
正如许多其他人所提到的,是正确的答案。application/json
但尚未解释的是您提出的其他选项的含义。
application/x-javascript
:之前 JavaScript 的实验性 MIME 类型是标准。application/javascript
text/javascript
:现已过时。使用 javascript 时应使用。application/javascript
text/x-javascript
:上述情况的实验性 MIME 类型。text/x-json
:JSON在正式注册之前的实验性MIME类型。application/json
总而言之,每当您对内容类型有任何疑问时,都应该查看此链接
评论
text/javascript
<script type="text/javascript" ...
type="text/javascript"
<script>...</script>
正确的 MIME 类型是 application/json
但
我经历过许多浏览器类型或框架用户需要的情况:
text/html
application/javascript
评论
我使用以下
contentType: 'application/json',
data: JSON.stringify(SendData),
如果 JSON 带有填充,那么它将是 .如果 JSON 没有填充,那么它将是 .application/jsonp
application/json
要同时处理这两个问题,最好使用“application/javascript”,而不用担心它是带填充还是不带填充。
评论
在 Spring 中,你有一个定义的类型:它相当于 application/json。MediaType.APPLICATION_JSON_VALUE
评论
发布时,应将 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");
使用此媒体类型的应用程序: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/json
text/javascript
text/plain
更奇怪的是 Flickr 发送的 Content-Type 标头,它以 .Google 使用一些 ajax api。text/xml
text/javascript
例子:
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
PHP开发人员使用这个:
<?php
header("Content-type: application/json");
// Do something here...
?>
对于 JSON,我使用:
Content-Type: application/json
IETF 的 JSON 数据交换格式 7158 提案第 1.2 节:JSON 规范中对此进行了描述。
在 PHP 中非常适合存储数组或对象 数据。
application/json
我使用此代码将数据放入 Google 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"));
扩展接受的响应,当您在 REST 上下文中使用 JSON 时...
关于使用和何时表示 REST 资源和集合,存在着很强的争论。application/x-resource+json
application/x-collection+json
如果您决定遵循 jsonapi 规范,则应使用 ,因为它已记录在案。application/vnd.api+json
尽管没有一个通用的标准,但很明显,为正在传输的资源添加的语义证明了一个更明确的 Content-Type 的合理性,而不仅仅是 .application/json
按照这个推理,其他上下文可以证明更具体的 Content-Type 是合理的。
评论
application/vnd.api+json
似乎专门针对使用 json:api 的 API,这是一个非常狭窄的规范,有自己的期望和格式,我不明白它适用于任何返回 json 的 API。如果我错了,请纠正我
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 脚本,因此它应该使用 JavaScript 的当前官方 MIME 类型。但是,在许多情况下,MIME 类型也可以正常工作。application/javascript,
text/javascript
请注意,RFC 4329(脚本媒体类型)文档已标记为已过时,建议改用类型。但是,由于遗留原因,它仍然被广泛使用,并且具有跨浏览器支持(MIME 类型并不总是如此,尤其是对于较旧的浏览器)。text/javascript
application/javascript
text/javascript
application/javascript
如果从 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
为了指定有趣的 JSON 结果,您可以在请求标头中添加“application/json”,如下所示:
“Accept:application/json”是所需的响应格式。
“Content-Type:application/json” 指定请求的内容格式,但有时您同时指定 和 ,但这些格式的质量可能不同。哪个服务器将发回不同的响应格式,请看以下示例:application/json
application/xml
Accept:application/json;q=0.4,application/xml;q=8
这将返回 XML,因为 XML 具有更高的质量。
评论
正确的当前标准是 。虽然默认编码是 UTF-8,但值得一提的是,它也可以是 UTF-16 或 UTF-32。当 JSON 以 UTF-16 或 UTF-32 编写时,必须使用二进制内容传输编码。application/json
RFC 4627 中有关 JSON 的详细信息: JavaScript 对象表示法 (JSON) 的 application/json 媒体类型
有关二进制传输编码的更多信息,请参见 5.Content-Transfer-Encoding 标头字段 (RFC 1341)。
为了补充前面的答案,根据 W3C 的 JSON 链接数据 (JSON-LD) 的 MIME 类型为:
application/ld+json
类型名称:应用程序
子类型名称:ld+json
此外,来自同一来源:
文件扩展名:
.jsonld
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
- application/json 正式注册前的 JSON。
评论
由于您可能需要更频繁地使用这些内容类型,因此即使有许多内容类型,也请始终尝试记住这三种内容类型:
- 内容类型:application/json
- 内容类型:application/xml
- 内容类型:text/html
评论
text/plain
你问题的一部分与我有关,因为我刚刚遇到它。
第三方提供商提供由多个客户端使用的 REST 服务。这是一个使用查询参数调用的简单 REST,返回格式正确的 JSON。我已经用 PHP 和 Java 测试了它,它按预期工作。
我的客户使用 Oracle Service Bus 作为其应用服务器和 Internet 之间的网关。当我制作 OSB 服务时,它因错误而崩溃。原来,被送回去的人是.OSB 根据此标头处理响应;在文本、XML 和 JSON 之间进行转换。在本例中,响应是 JSON,但标头没有这么说。联系供应商时,我得到的答复是:“我们不会改变它,因为它不会影响其他任何人”。Invalid message format
content-type
text/html
标头指定内容应该是什么,而不是它的实际内容。也就是说,在您的消费程序中,您可以检查或忽略它并以任何方式处理内容。另一个示例是,您可以返回 GIF 数据,但将内容类型指定为 JSON,然后继续忽略标头并读取图像数据。这不会损害您的程序,但可能会伤害其他人。Content-Type
故事的寓意:玩得好。
正如一些研究,
最常见的 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 媒体类型)中的完整详细信息。
评论
这取决于观点。
如果您是发送请求的客户端,那么是正确的选择。application/json
但是,如果您是接收请求的服务器,则必须做好准备,客户端也可以发送编码。所以和有效。application/json
application/json; charset=utf-8
在这两种情况下,媒体类型相同。但内容类型不同。
最常见的 MIME 类型是 application/json。下面是所有 JSON 内容类型的列表:
Content-Type: application/json
- JSON格式Content-Type: text/x-json
- 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 媒体类型,但已过时
其他参考资料:
RFC4627 - JavaScript 对象表示法 (JSON) 的媒体类型application/json
评论
要使用的标准和广泛接受的 JSON 内容类型是:
应用程序/json
您应该使用它,因为:
- 用于在 HTTP 请求和响应中传输 JSON 数据的内容类型。
- 它是 JSON 数据的官方 MIME 类型,所有现代浏览器和 Web 服务器都支持它。
其他是过时的:
用户提到的其他内容类型(application/x-javascript、text/javascript、text/x-javascript、text/x-json)在过去 JSON 不像现在这样标准化时使用。但是,由于潜在的安全性和兼容性问题,不建议立即使用它们。
安全问题:
一些较旧的浏览器可能会将 JavaScript 内容类型(application/x-javascript、text/javascript、text/x-javascript)解释为可执行脚本,如果攻击者注入恶意代码,可能会导致安全漏洞。
使用非标准内容类型提供 JSON 数据可能会触发某些浏览器或 Web 应用程序中的安全机制。
浏览器支持:
- 虽然现代浏览器在很大程度上对 application/json 进行了标准化,但一些较旧的浏览器可能无法正确处理其他内容类型。
- application/json 被所有主流浏览器所支持,并已成为 JSON 数据的事实标准。
希望它有所帮助。
下一个:可以在JSON中使用注释吗?
评论