我已经和JSON混了一段时间了,只是把它作为文本推出来,它不会伤害任何人(据我所知),但我想开始做正确的事情。
我已经看到了很多关于JSON内容类型的所谓"标准":
1 2 3 4 5
| application/json
application/x-javascript
text/javascript
text/x-javascript
text/x-json |
但哪一个是正确的,还是最好的?我认为它们之间存在不同的安全和浏览器支持问题。
我知道有一个类似的问题,如果一个RESTAPI返回了JSON,那么是什么mime类型?但是我想要一个更有针对性的回答。
- 相关文章.NET框架中的"application/json"常量
对于JSON文本:
application/json
The MIME media type for JSON text is application/json. The default encoding is UTF-8. (Source: RFC 4627).
对于带有回调的jsonp(可运行的javascript):
application/javascript
以下是一些相关评论中提到的博客文章。
- 为什么不使用text/html作为json
- Internet Explorer有时与application/json有问题(死亡2018-06-26)
- 一个相当完整的mimetypes列表以及它们的用途
- 下面是来自@gnrfan答案的IANA官方MIME类型列表
- 完整的mime类型列表
- 我可以把文件和JSON文本一起发送吗?
- 它有什么类型的mime真的很重要吗?它是被解析为对象的文本。如果你想让它在浏览器中无需强制下载就可以打开,将它作为文本/纯文本传递,如果你想让它自动下载,将它作为应用程序/八位字节流传递(如果你在一个打算在本地保存的网页上生成它,这很有用)。真的有那么多人需要知道mime类型,以便下载者可以用一个特殊的json查看器查看它吗?我遗漏了什么使它成为一种特殊的mime类型?
- 一般来说,使用"text/plain"是一种不好的做法。例如,Web平台中存在攻击,如果您未能发送适当的mime类型值,则允许跨源数据盗窃。
- Internet Explorer有时与application/json有问题-blog处于脱机状态
- 假设我有一个文档是由某人写的,其中包含纯文本。现在纯文本恰好也是有效的JSON。那么,使用文本/纯文本作为其mime类型是错误的吗?JSON是文本的子类型。所以我认为两者都应该被允许。问题是哪一个在实践中更有效。根据codetoshare的评论,ie与application/json存在问题。但是任何浏览器都不应该有文本/纯文本的问题。如果文本/纯文本不安全,那么如何从我的网站提供文本文件?
IANA已将JSON的官方mime类型注册为application/json。
当被问及为什么不使用text/json时,crockford似乎说json不是真正的javascript,也不是文本,而且iana比text/*更有可能使用application/*。
更多资源:
- 媒体类型
- 征求意见4627
- bluesmoon:json有一个类型
- 早期有很多东西被放进了text/*区,这些天可能会被放进application/*区。
- 这是一个很大的错误。JSON是文本。可由任何文本编辑器读取/写入。这是很有价值的,但不能从application/json中得出。我认为,如果能在text下使用文本编辑器打开所有内容,在text/xml/xhtml下使用特定的XML doctypes等,那就太好了。这真的有助于组织。
- 我可以在文本编辑器中打开一个.jpg。
- @Rohmer-您可以在文本编辑器中"打开"任何内容,但是像jpeg或windows.exe或.zip这样的二进制格式将包含不可打印的字符,这些字符实际上会破坏许多文本编辑器或导致不需要的行为。例如,尝试运行cat file.jpg。而任何XML或JSON文件都是100%可打印的。所以我认为斯蒂金·德维特的观点是正确的,尽管事实是,现在改变还为时已晚。
- @xp84您可以使用十六进制形式的文本编辑器打开任何二进制文件。所有不同的字符(其中16个)都是100%可打印的。所以,根据这个逻辑…所有二进制文件都是文本吗?JSON不是文本。JSON是(警告:前面是非正式的松散定义)对象(或对象数组)的文本表示。
- 短语"十六进制文本编辑器"没有意义。十六进制编辑器将每个字节显示为十六进制值,例如,字节1111000显示为"78"。虽然有些文本编辑器也有十六进制编辑模式,但除了执行最技术任务的大多数技术用户之外,这既不常见也不有用。相比之下,文本表示ASCII或Unicode,在文本中,字节1111000表示小写的x字符。不是78。JSON是与HTML(文本/HTML)完全相同的文本。它只包含可读的文本字符,其中包含结构化的含义。
- 我倾向于同意斯蒂恩·德维特的观点。JSON是用文本编辑器查看和编辑的。
对于JSON:
1
| Content-Type: application/json |
对于JSON-P:
1
| Content-Type: application/javascript |
- 虽然jsonp不是真正的json,但它是一种传递javascript对象文本的技术。
当然,JSON的正确mime媒体类型是application/json,但必须了解应用程序中需要什么类型的数据。
例如,我使用ext-gwt,服务器响应必须作为文本/html,但包含JSON数据。
客户端,外部GWT窗体侦听器
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 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响应类型,浏览器建议我保存该文件。
使用SpringMVC的服务器端源代码段
1 2 3 4 5 6 7 8 9 10 11
| 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);
}
}; |
- 服务器响应必须为文本/html。对于extjs变体也是如此。
杰森:
响应是根据URL中传递的查询参数动态生成的数据。
例子:
1
| {"Name":"Foo","Id": 1234,"Rank": 7 } |
内容类型:application/json。
JSON-P:
带填充的JSON。响应是JSON数据,周围环绕着函数调用。
例子:
1
| functionCall({"Name":"Foo","Id": 1234,"Rank": 7}); |
内容类型:application/javascript。
- JSON的定义错误。它不需要动态生成或尊重查询参数。您可以提供静态JSON文件。而且,最乐观的答案有一个到RFC的链接。
- 同样,jsonp可以是分配给var的json数据。
如果您使用的是Ubuntu或Debian,并且通过Apache提供.json文件,那么您可能希望为这些文件提供正确的内容类型。我这样做主要是因为我想使用火狐扩展jsonview
Apache模块mod_mime将有助于轻松实现这一点。但是,使用Ubuntu,您需要编辑文件/etc/mime.types并添加行
然后重新启动Apache:
1
| sudo service apache2 restart |
- 通常,重新加载就足够了(比重新启动更快)。另外,请注意,您现在可以执行"sudo服务apache2重新加载"。
- Ubuntu 12.04默认设置为
如果从客户端调用ASP.NET Web服务,则必须使用application/json才能使其工作。我相信这对于jquery和ext框架也是一样的。
- jquery似乎至少可以与'application/json'和'text/plain'一起使用…但我没有试过其他的。
- jquery能够与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的正确内容类型是application/json,除非您使用的是jsonp,也称为带填充的json,实际上是javascript,所以正确的内容类型是application/javascript。
毫无疑问,对于JSON响应,application/json是最好的mime类型。
但我有一些经验,因为一些压缩问题,我不得不使用application/x-javascript。我的托管环境是与Godaddy共享的托管。它们不允许我更改服务器配置。为了压缩响应,我在web.config文件中添加了以下代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <httpCompression>
<scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll"/>
<dynamicTypes>
</dynamicTypes>
<staticTypes>
</staticTypes>
</httpCompression>
<urlCompression doStaticCompression="true" doDynamicCompression="true"/> |
通过使用这个,用g-zip压缩了.aspx页,但json响应没有。我补充说
在静态和动态类型部分。但这根本不压缩JSON响应。
之后,我删除了这个新添加的类型并添加了
在静态和动态类型部分中,并在
.ashx(异步处理程序)到
1
| application/x-javascript |
现在我发现我的JSON响应是用g-zip压缩的。所以我个人推荐使用
1
| 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 Form Submit to Upload文件,请注意浏览器会解析服务器响应,以便为创建文档。
如果服务器使用JSON发送返回对象,则必须将Content-Type头设置为text/html头,以便通知浏览器将未更改的文本插入文档体。
请参见ext JS 3.4.0 API文档。
- 应尽可能避免使用不符合标准的工具;根据规范使用application/json。
- @one.beat.consumer虽然是这样,但它本身并不特定于extjs。这是一个浏览器限制(或者更确切地说,可能是一个"安全措施")。
- 当然,最好使用文本/纯文本,这样就不会对非HTML内容应用任何HTML语义了?或者浏览器不允许您提取没有DOM的帧内容吗?
- 更让人困惑的是:我只是在使用默认浏览器的三星Galaxy Beam(Android 2.3)上调试了一个类似的案例,iframe似乎为application/javascript、application/x-javascript、text/javascript、text/plain触发了load事件,但没有为application/json或text/html触发它。截至今天,Android<=2.3约占Android市场份额的50%。
JSON是一种特定于域的语言(DSL)和独立于JavaScript的数据格式,因此它有自己的mime类型,application/json。当然,对mime类型的尊重是由客户机驱动的,因此text/plain可以用于字节的传输,但是您将不必要地向供应商应用程序域推送解释—application/json。您会通过text/plain传输XML吗?
但是,老实说,您选择的mime类型是关于如何解释数据的建议——text/plain或text/html(当它不是html时)就像类型擦除——它与用类型语言生成类型对象的所有对象一样不具有格式性。
我所知道的任何浏览器运行时都不会接受JSON文档,并自动将其作为JavaScript可访问对象提供给运行时,而无需干预,但如果您使用的是一个受损的客户机,则完全不同。但事实并非如此,RESTfulJSON服务通常没有JavaScript运行时,但它并不能阻止他们将JSON作为一种可行的数据交换格式。如果客户是残废的…然后我会考虑通过Ajax模板服务进行HTML注入。
应用程序/json!
如果您在客户端环境中,对于一个受良好支持的Web应用程序,必须调查跨浏览器支持。
正确的HTTP内容类型应该是application/json,其他内容也已经突出显示,但是一些客户机处理得不太好,所以jquery建议使用默认的text/html。
正确答案是:
1
| Content-Type: application/json |
正如许多其他人提到的,application/json是正确的答案。
但还没有解释的是,你提出的其他选择意味着什么。
application/x-javascript:在application/javascript标准化之前,实验性的javascript mime类型。
text/javascript:现在已经过时了。使用javascript时,应该使用application/javascript。
text/x-javascript:针对上述情况的实验性mime类型。
text/x-json:在application/json正式注册之前,JSON的实验性mime类型。
总之,每当您对内容类型有任何疑问时,您应该检查此链接
- 江户十一〔五〕是什么时候过时的?我还在用
我用下面
1 2
| contentType: 'application/json',
data: JSON.stringify(SendData), |
发布时,Content-Type头应设置为"application/json"。侦听请求的服务器应包括"accept=application/json"。在SpringMVC中,您可以这样做:
1
| @RequestMapping(value="location", method = RequestMethod.POST, headers ="Accept=application/json") |
向响应添加头:
1 2
| HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type","application/json"); |
布尔奇1(P)I use this code to put data in JSon on Google cloud storage(GCS)which is set publically viewable:(p)字母名称(P)To get back the data is straight forward:(p)字母名称
在Spring中,您有一个定义的类型:MediaType.APPLICATION_JSON_VALUE,相当于application/json。
- 也就是JavaEE::JavaX.WS.R.C.MyType
(P)For JSON,I am using:(p)字母名称(P)This is described in the IETF's JSon data interchange format 7158 proposal,section 1.2:specifications of JSon.(p)
如果JSON带有填充,那么它将是application/jsonp。如果JSON没有填充,那么它将是application/json。
要同时处理这两个问题,最好使用"application/javascript",而不必担心它是带填充还是不带填充。
- 你回答的第一部分是错误的。"application/jsonp"不是有效的mime类型。JSONP的响应主体只是javascript,因此必须使用javascript的mime类型之一。
(P)扩展被接受的反应,当你使用JSON在一个不复存在的情况下…(p)(P)有一个强大的争论关于使用EDOCX1的英文字母10和EDOCX1的英文11,当你代表了剩余的资源和收集。(p)(P)and if you decide to follow the JSonapi specification,you should use of EDOCX1 penal 12,as it is documented.(p)(P)尽管存在着一种普遍的标准,但它清楚地表明,向资源转移的附加周报只不过是一种更为明确的内容,而不是仅仅是一种口头的。(p)(P)Following this reasoning,other context could justify a more specific content-type.(p)
- application/vnd.api+json似乎专门针对使用json:api的API,这是一个非常狭窄的规范,有自己的期望和格式,我不理解它适用于任何返回json的API。如果我错了请纠正我
(P)php developers use this:(p)字母名称
(P)If you get data from rest api in JSon so you have to use content-type(p)字母名称
(P)JSON(Javascaript object notation)and JSON("JSON with padding")formats seems to be very similar and there it might be very confusing which mime type they should be using.即使认为格式相似,它们之间也有一些小标题的差异。(p)(P)So when never in any doubts,I have a very simple approach(which works perfectly fine in most cases),namely,go and check corresponding RFC document.(p)(P)JSONRFC 4627(The application/JSon media type for Javascript object notation(JSON))is a specifications of JSon format.It says in section 6,that the mime media type for JSon text is(p)字母名称(P)JSONJSON("JSON with padding")is handled different way than JSON,in a browser.JSON is treated as a regular Javascript script and there it should use EDOC X1 original 14.The current official mime type for Javascript.In many cases,however,EDOCX1 English 4.Mime type will work fine too.(p)(P)Note that EDOCX1 original has been marked as obsolete by RFC 4329(scripting media types)document and it is recommended to use EDOCX1 English 1 Type Instead.However,due to legacy reasons,EDOCX1 pental 4 is still widely used and it has cross-browser support(which is not always a case with EDOCX1 pental 1 mime type,especially with older browsers).(p)
Content-Type: application/json—jsonContent-Type: application/javascript—json-pContent-Type: application/x-javascript—javascriptContent-Type: text/javascript-javascript,但已过时,旧的IE版本用作HTML属性。Content-Type: text/x-javascript—javascript媒体类型,但已过时Content-Type: text/x-json-json申请/json正式注册前。
(P)For specifying the interesting JSon result,you add"application/json"in your request header like below:(p)(P)"Accept:application/json"is a desired response format.(p)(P)"content-type:application/json"specifies the content format of your request,but sometimes you specify both EDOCX1 universal 0-nabian and EDOCX1 individual 21,but the quality of these might be different.Which server will send back the different response formats,look at the example:(p)字母名称(P)This will return xml,because xml has higher quality.(p)
(P)The proper current standard is EDOCX1While the default encing is UTF-8,it is worth mentioning that it could also be UTF-16 or UTF-32.When JSon isWritten in UTF-16 or UTF-32,binary content-transfer-encounding must be used.(p)(P)There is more information about JSon here:https://tools.ietf.org/html/rfc4627(p)(P)More information on binary transfer encounding here:https://www.w3.org/protocols/rfc1341/5′uu content-transfer-encoding.html(p)
为了补充其余的答案,根据W3C,JSON链接数据(JSON-LD)的mime类型是:
application/ld+json
Type name: application
Subtype name: ld+json
此外,从同一来源:
File extension(s):
.jsonld
即使有许多内容类型,也要记住这三种内容类型。因为你可能需要更频繁地使用这些。
- 内容类型:application/json
- 内容类型:application/xml
- 内容类型:文本/HTML