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

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

我见过这样的JSON内容类型很多所谓的"标准":

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

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

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

回答

对于JSON文本:

application/json

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

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

  • 为什么不应该使用text/htmlJSON
  • Internet Explorer有时会出现问题application/json(DEAD 2018-06-26)
  • 一个相当完整的Mimetypes列表以及它们的用途
  • IANA的官方mime类型列表来自@ gnrfan的答案如下
  • [完整的MIME类型列表](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Complete_list_of_MIME_types)
  • Internet Explorer有时会出现application/json问题 - 博客处于脱机状态
  • 想象一下,我有一个由包含纯文本的人写的文档.现在,纯文本恰好也是有效的JSON.那么我将使用text/plain作为其mime类型是错误的吗?JSON是SUB-TYPE文本.所以我认为两者都应该被允许.问题是哪种方法在实践中更好.根据codetoshare的评论,IE在application/json方面存在问题.但是没有浏览器应该有text/plain的问题.如果text/plain不安全,那么如何从我的网站提供文本文件?
  • @EugenMihailescu该页面的标题是“ MIME类型的不完整列表”

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

当被问及为什么不text/json,克罗克福德似乎说JSON是不是真正的JavaScript也不是文字,也IANA更有可能来伸手application/*text/*.

更多资源:

  • 媒体类型
  • 征求意见4627
  • bluesmoon:JSON有一个类型
  • 早期的很多内容都被放入了`text/*`部分,这些可能会被放入`application/*`部分.
  • @Rohmer - 您可以"在文本编辑器中"打开任何内容,但是像JPEG或Windows .exe或.zip这样的二进制格式将包含不可打印的字符,这些字符实际上可能会破坏许多文本编辑器或导致意外行为.例如,尝试运行`cat file.jpg`.而任何xml或json文件都是100%可打印的.因此,我认为Stijn de Witt的观点是有效的,尽管事实是,现在改变为时已晚.
  • 我可以在文本编辑器中打开`.jpg`.
  • 我倾向于同意Stijn de Witt.JSON旨在使用文本编辑器进行查看和编辑.
  • @ XP84您可以使用HEX格式的文本编辑器打开任何二进制文件.所有不同的角色(其中16个)都是100%可打印的.那么,通过那个逻辑......*都是二进制文本?***Json不是文本.**Json是*(警告:前面的非正式松散定义)*对象(或对象数组)的文本表示
  • 短语"HEX形式的文本编辑器"没有意义.十六进制编辑器将每个字节显示为十六进制值,例如,字节1111000为"78".虽然可能有一些文本编辑器也恰好具有十六进制编辑模式,但这对于除了执行最多技术任务的最技术用户之外的任何事情都不常见也没有用.相比之下,文本表示ASCII或Unicode,而在文本中,字节1111000表示小写的"x"字符.不是78. JSON是与HTML(text/html)完全相同的文本.它只包含可读的文本字符,其中包含结构化含义.

对于JSON:

Content-Type: application/json

对于JSON-P:

Content-Type: application/javascript
  • JSONP不是真正的JSON,它是一种传递JavaScript对象文字的技术

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

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数据.

如果您使用的是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默认使用此功能

如果您从客户端调用ASP.NET Web服务,则必须使用application/json它来运行它.我相信jQuery和Ext框架也是如此.

  • jQuery似乎至少与'application/json'和'text/plain'一起工作......但我还没有尝试过所有其他的.

JSON的正确内容类型是,application/json除非你正在使用JSONP,也称为带有Padding的JSON,它实际上是JavaScript,所以正确的内容类型就是如此application/javascript.


毫无疑问,这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`,我在我的共享主机上利用它,我不会建议使用不同的内容类型来启用压缩,这是完全错误的.它可以做到,但它仍然是错的.对*浏览器支持*使用不同的内容类型是一回事,使用不同的内容类型进行服务器端压缩是另一回事.

只有当使用application/json的MIME类型,我有以下(2011年11月与最新版本的Chrome,Firefox浏览器的Firebug的):

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

并非一切都适用于内容类型application/json.

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

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

请参阅Ext JS 3.4.0 API文档.

  • 应尽可能避免不符合标准的工具; 根据规范使用`application/json`.
  • @ one.beat.consumer虽然这是真的,但它并不特定于ExtJs本身.这是浏览器限制(或者更确切地说,可能是"安全措施").
  • 当然,使用text/plain会更好,因此它不会将任何HTML语义应用于非HTML内容?或者,如果没有DOM,浏览器是否允许您提取框架的内容?
  • 为了进一步混淆:我只是在三星Galaxy Beam(Android 2.3)上使用默认浏览器调试类似的情况,而`iframe`似乎为`application/javascript`,`application/x-javascript激活`load`事件`,`text/javascript`,`text/plain`,但******为`application/json`和`text/html`解雇它.截至今日,Android <= 2.3约占Android市场份额的50%.

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

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

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

应用程序/ JSON!


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

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


正确答案是:

Content-Type: application/json

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

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

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

  • @Oli你可以安全地删除`type ="text/javascript"`并且至少根据HTML5执行`<script> ... </ script>`.
  • 什么时候`text/javascript`变得过时了?我仍在使用`<script type ="text/javascript"...`标签填充HTML文档.
  • 它对浏览器没什么影响,真的.它已经过时了RFC标准:http://www.rfc-editor.org/rfc/rfc4329.txt

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

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

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


" 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登记application/json

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

浏览器支持是另一回事.

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

更奇怪的是Flickr发送的Content-Type标头,它将JSON返回为text/xml.谷歌使用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


正确的MIME类型是 application/json

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

text/html
application/javascript
  • 这种情况的例子?

我用下面的

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

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

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

  • 这也是Java EE :: [javax.ws.rs.core.MediaType](http://docs.oracle.com/javaee/6/api/javax/ws/rs/core/MediaType.html#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"));

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

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

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

对于JSON,我正在使用:

 Content-Type: application/json

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


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

关于使用和何时表示REST资源和集合,存在强烈的争论.application/x-resource+jsonapplication/x-collection+json

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

尽管没有通用的标准,很明显,被转移的资源增加的语义证明了更明确的内容类型而不仅仅是application/json.

根据这种推理,其他上下文可以证明更具体的内容类型.

  • `application/vnd.api + json`似乎是专门为apis使用[json:api](http://jsonapi.org/),这是一个非常狭窄的规范,有自己的期望和格式,我不明白它用于返回json的*any*API.如果我错了,请纠正我

PHP开发人员使用这个:

<?php
header("Content-type: application/json");
// Do something here...
?>

如果从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

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/javascriptMIME类型也可以正常工作.

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


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.


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

"Accept:application/json"是一种理想的响应格式.

"内容类型:应用程序/ JSON"指定您的要求的内容格式,但有时你同时指定application/jsonapplication/xml,但这些质量可能会有所不同.哪个服务器将发回不同的响应格式,请看示例:

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

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


适当的当前标准是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


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

输入名称:应用程序

子类型名称: ld + json

另外,来自同一来源:

.jsonld


即使内容类型很多,也要始终记住这三种内容类型。因为您可能不得不更频繁地使用它们。

  • 内容类型:application / json
  • 内容类型:application / xml
  • 内容类型:text / html
  • 不要忘了`text / plain`

作为一些研究,

最常见的 MIME 类型是

应用程序/json

让我们看一个例子来区分 json 和 javascript。

  • 应用程序/json

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

例如-

<?php
header('Content-type:application/json');
  
$directory =[
    ['Id'=> 1, 'Name' => 'this' ],
    ['Id'=> 2, 'Name' => 'is'],
    ['Id'=> 3, 'Name' => 'stackoverflow'],
      ];
  
// Showing the json data
echo json_encode($directory);
?>

输出是,

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

  • 应用程序/javascript

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

例如

<?php
header('Content-type:application/javascript');
$dir =[
    ['Id'=> 1, 'Name' => 'this' ],
    ['Id'=> 2, 'Name' => 'is'],
    ['Id'=> 3, 'Name' => 'stackoverflow'],
      ];
echo "Function_call(".json_encode($dir).");";
  
?>

输出是,

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

对于其他 MIME 类型,请在此处查看完整详细信息,

https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types


以上是什么是正确的JSON内容类型?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>