什么是正确的JSON内容types?

我已经把JSON搞乱了一段时间,只是把它作为文本推出来,并没有伤害任何人(我知道的),但我想开始正确的做事。

我已经看到了很多JSON内容types的“标准”:

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

但是哪个是正确的,还是最好的? 我收集他们之间的安全和浏览器支持问题。

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

对于JSON文本:

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

对于带callback的JSONP :

application/javascript

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

  • 为什么你不应该使用text/html的JSON
  • Internet Explorer有时与application/json有问题
  • 一个相当完整的Mimetypes列表以及使用它们的方法

IANA已经将JSON的官方MIMEtypes注册为application/json

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

更多资源:

  • 媒体types
  • 征求意见4627
  • bluesmoon:JSON有一个types

对于JSON:

 Content-Type: application/json 

对于JSON-P :

 Content-Type: application/javascript 

当然,JSON的正确MIME媒体types是application/json ,但是有必要了解应用程序中预期的数据types。

例如,我使用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响应types的情况下,浏览器build议我保存该文件。

服务器端使用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); } }; 

JSON:

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

例:

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

内容types: application/json


JSON-P:

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

例:

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

内容types: application/javascript

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

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

 application/json json 

然后重启Apache:

 sudo service apache2 restart 

如果您从客户端调用ASP.NET Web服务,则必须使用application/json才能正常工作。 我相信这与jQuery和Ext框架是一样的。

JSON的正确内容types是application/json除非你使用的是JSONP ,也就是所谓的带有Padding的JSON,它实际上是JavaScript,所以正确的内容types是application/javascript

毫无疑问, application/json是JSON响应的最佳MIMEtypes。

但我有一些经验,因为一些压缩问题,我不得不使用application/x-javascript 。 我的托pipe环境与GoDaddy共享托pipe。 他们不允许我改变服务器configuration。 我已经将下面的代码添加到我的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"/> 

在静态和dynamictypes的部分。 但是这根本不压缩JSON响应。

之后,我删除了这个新添加的types,并添加

 <add mimeType="application/x-javascript" enabled="true"/> 

在静态和dynamictypes部分,并改变了响应types

.ashx(asynchronous处理程序)来

 application/x-javascript 

现在我发现我的JSON响应是用g-zip压缩的。 所以我个人推荐使用

 application/x-javascript 

只有当你想压缩你的JSON响应共享主机环境 。 因为在共享主机中,它们不允许您更改IISconfiguration。

只有在使用application/json作为MIMEtypes时,我有以下几点(截至2011年11月,最新版本的Chrome,Firefox和Firebug ):

  • 从服务器加载JSON时,不会再有来自Chrome的警告。
  • Firebug将在响应中添加一个标签,显示格式化的JSON数据。 如果MIMEtypes不同,则只会显示为“响应内容”。

不是所有的内容types的application/json作品。

如果您使用Ext JS表单提交上传文件,请注意,浏览器会parsing服务器响应,为<iframe>创build文档。

如果服务器使用JSON发送返回对象,那么Content-Type头部必须设置为text/html ,以便告诉浏览器将文本原样插入到文档主体中。

请参阅Ext JS 3.4.0 API文档 。

JSON是特定于域的语言 (DSL)和独立于JavaScript的数据格式,因此具有自己的MIMEtypesapplication/json 。 尊重MIMEtypes当然是客户端驱动的,所以text/plain可以做字节传输,但是你会不必要地将解释推给供应商应用程序域 – application/json 。 你会通过text/plain传输XML吗?

但是说实话,你select的MIMEtypes对于如何解释data- text/plaintext/HTML (当它不是HTML)就像是types擦除一样,对于客户来说是一种build议,以打字的语言。

我知道没有一个浏览器运行时会获取一个JSON文档,并将其作为一个JavaScript可访问的对象自动提供给运行时,而不需要干预,但是如果您正在使用一个残缺的客户端,则完全是另一回事。 但是,这不是全部的故事–RESTful JSON服务通常没有JavaScript运行时,但是并不能阻止他们使用JSON作为可行的数据交换格式。 如果客户是跛脚的…那么我会考虑通过一个Ajax模板服务,而不是HTML注入。

应用程序/ JSON!

如果您处于客户端环境中,则需要对支持良好的Web应用程序进行跨浏览器支持的调查。

正确的HTTP内容types应该是application/json ,正如其他人已经强调的那样,但是一些客户端不能很好地处理它,这就是为什么jQuery推荐默认的text/html

正确的答案是:

 Content-Type: application/json 

和其他人一样, application/json是正确的答案。

但是还没有解释的是你提出的其他select是什么意思。

  • application/x-javascriptapplication/javascript之前的JavaScript的实验性MIMEtypesapplication/javascript被制定为标准。

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

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

  • text/x-jsonapplication/json正式注册之前JSON的实验性MIMEtypes。

总而言之,只要你对内容types有任何疑问,你应该检查这个链接

在JSP中 ,你可以在页面指令中使用这个:

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

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

application/json ”是正确的JSON内容types。

 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注册说

使用此媒体types的应用程序: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 没有列出其他任何媒体types ,实际上甚至application/javascript现在已经过时了。 所以application/json是唯一可能的正确答案。

浏览器支持是另一回事。

支持最广泛的非标准媒体​​typestext/jsontext/javascript 。 但是一些大牌甚至使用text/plain 。 更为奇怪的是由Flickr发送的Content-Type头,他使用text/xml返回一个JSONstring。 也包括Google示例,用text/html还有一个JSONstring进行响应。

例子:

 curl -I http://ajax.googleapis.com:80/ajax/services/search/web\?q\=json 

输出: Content-Type: text/html

 curl -I https://www.flickr.com/services/rest/?method=flickr.test.echo&format=json&api_key=f82254c1491d894f1204d8408f645a93 

输出: Content-Type: text/xml

正确的MIMEtypes是application/json

我经历了许多浏览器types或框架用户需要的情况:

 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中,你有一个定义的types: MediaType.APPLICATION_JSON_VALUE ,它相当于application / json

application/json在php中工作良好,可以存储数组或对象数据。

我使用此代码将数据放入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'是一个很好的做法,不用担心是使用填充还是不使用填充。

对于JSON,我正在使用:

  Content-Type: application/json 

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

如果您从JSON中的REST API获取数据,那么您必须使用内容types

 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 

PHP开发人员使用这个:

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

扩展接受的响应,当您在REST环境中使用JSON时…

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

如果你决定遵循jsonapi规范, 你应该使用application/vnd.api+json ,就像它被logging的那样。

尽pipe没有一个通用的标准,但很显然,被转移的资源所增加的语义certificate了一个比application/json更明确的Content-Type

根据这个推理,其他上下文可以certificate更具体的内容types

JSON (JavaScript对象表示法)和JSONP (“带填充的JSON”)格式似乎非常相似,因此可能非常混淆他们应该使用的MIMEtypes。 尽pipe格式似乎非常相似,但它们之间有一些细微的差别。

所以无论什么时候有什么疑问,我都有非常简单的方法(在大多数情况下完美的find了),即去检查相应的RFC文档。

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

 application/json. 

JSONP JSONP(“带填充的JSON”)在浏览器中的处理方式与JSON不同。 JSONP被视为一个普通的JavaScript脚本,因此它应该使用application/javascript,这是JavaScript的官方MIMEtypes。 然而,在很多情况下, text/javascript MIMEtypes也可以正常工作。

请注意, text/javascript已被RFC 4329 (Scripting Media Types)文档标记为废弃,build议使用application/javascripttypes。 但是,由于遗留的原因, text/javascript仍然被广泛使用,它具有跨浏览器的支持(对于application/javascript MIMEtypes,并不总是这种情况,特别是在较老的浏览器中)。

  Content-type: application/json,json Content-Type: application/javascript, json-P Content-type: application/x-javascript, javascript Content-type: text/javascript, javascript BUT obsolete, older IE versions used to use as html attribute Content-type: text/x-javascript, JavaScript Media Types BUT obsolete Content-type: text/x-json, json before application/json got officially registered.