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

时间:2009-01-25 15:25:19

标签: json http-headers content-type

我已经和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? ,但我想要一个稍微有针对性的答案。

36 个答案:

答案 0 :(得分:9703)

对于JSON文本:

<强> application/json

  

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

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

  

<强> application/javascript

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

答案 1 :(得分:1560)

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

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

更多资源:

答案 2 :(得分:835)

对于JSON:

Content-Type: application/json

适用于JSON-P

Content-Type: application/javascript

答案 3 :(得分:611)

当然,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);
    }
};

答案 4 :(得分:453)

JSON:

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

示例:

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

内容类型: application/json


JSON-P:

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

示例:

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

内容类型: application/javascript

答案 5 :(得分:388)

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

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

application/json json

然后重启Apache:

sudo service apache2 restart

答案 6 :(得分:373)

如果您从客户端调用ASP.NET Web服务,则必须使用application/json才能使用它。我相信jQueryExt框架的情况相同。

答案 7 :(得分:297)

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

答案 8 :(得分:286)

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

答案 9 :(得分:260)

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

  • 从服务器加载JSON时,Chrome不再发出警告。
  • Firebug会在响应中添加一个标签,显示JSON数据 格式化。如果MIME类型不同,它将显示为 '回应内容'。

答案 10 :(得分:235)

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

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

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

请参阅the Ext JS 3.4.0 API documentation

答案 11 :(得分:220)

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!

答案 12 :(得分:204)

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

正确的HTTP Content-Type将是application/json,因为其他人已经突出显示,但是有些客户端没有很好地处理它,这就是为什么jQuery推荐默认的text/html

答案 13 :(得分:163)

正确答案是:

Content-Type: application/json

答案 14 :(得分:160)

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

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

  • application/x-javascriptapplication/javascript标准之前JavaScript的实验MIME类型。

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

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

  • text/x-jsonapplication/json正式注册之前JSON的实验MIME类型。

总而言之,只要您对内容类型有任何疑问,就应该检查this link

答案 15 :(得分:142)

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

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

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

答案 16 :(得分:110)

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

答案 17 :(得分:102)

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 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

答案 18 :(得分:85)

正确的MIME类型为 application/json

<强> BUT

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

text/html

application/javascript

答案 19 :(得分:72)

我使用下面的

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

答案 20 :(得分:64)

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

答案 21 :(得分:57)

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

答案 22 :(得分:57)

  

application/json在PHP中非常适合存储数组或对象   数据

我使用此代码将数据放在Google Cloud Storage (GCS)上设置为publically viewable的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"));

答案 23 :(得分:49)

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

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

答案 24 :(得分:49)

对于JSON,我正在使用:

 Content-Type: application/json

IETF的JSON数据交换格式7158提案Section 1.2: Specifications of JSON中对此进行了描述。

答案 25 :(得分:42)

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

当您表示REST资源和集合时,有strong argument使用function totalHours(containerID) { var table = document.getElementById(containerID); var rows = table.rows; var rowsLength = rows.length; var total = 0; for(var i = 0; i < (rowsLength - 1); i += 1) { // not the TOTAL input! var input = rows[i].cells[1].getElementsByTagName("input"); if(input[0].value !== "") { // no empty inputs total += parseInt(input[0].value); } } return total; } application/x-resource+json

如果您决定遵循 jsonapi 规范,you should使用application/x-collection+json,请将其记录下来。

尽管没有通用的标准,很明显,被转移的资源添加的语义证明了更明确的 Content-Type ,而不仅仅是application/vnd.api+json

根据这个推理,其他上下文可以证明更具体的 Content-Type

答案 26 :(得分:41)

PHP开发人员使用它:

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

    // Do something here...
?>

答案 27 :(得分:24)

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/javascript MIME类型也可以正常工作。

请注意,RFC 4329(脚本媒体类型)文档已将text/javascript标记为已废弃,建议改为使用application/javascript类型。但是,由于遗留原因,text/javascript仍然被广泛使用,并且它具有跨浏览器支持(application/javascript MIME类型并非总是如此,特别是对于旧浏览器而言。)

答案 28 :(得分:23)

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正式注册之前。

答案 29 :(得分:6)

要指定有趣的JSON结果,请添加&#34; application / json&#34;在您的请求标题中,如下所示:

&#34;接受:应用/ JSON&#34;是一种理想的响应格式。

&#34;内容类型:应用/ JSON&#34;指定请求的内容格式,但有时您同时指定application/jsonapplication/xml,但这些质量可能会有所不同。哪个服务器将发回不同的响应格式,请查看示例:

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

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

答案 30 :(得分:5)

正确的当前标准是var timer; $(".homeLinkWrap").mouseenter(function() { timer = setTimeout((function() { $(this).find('.homeLinkNfo').removeClass('flipOutY').addClass('flipInY').css({ opacity: '1' }); }).bind(this), 1000); }).mouseleave(function() { $(this).find('.homeLinkNfo').removeClass('flipInY').addClass('flipOutY'); clearTimeout(timer); }); 。虽然默认编码是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

答案 31 :(得分:5)

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

  

application/ld+json

     

类型名称:应用

     

子类型名称: ld + json

此外,来自同一来源:

  

文件扩展名

     

.jsonld

答案 32 :(得分:1)

即使有many content types,也总是要记住这三种内容类型。因为您可能不得不更频繁地使用它们。

  • 内容类型:application / json
  • 内容类型:application / xml
  • 内容类型:text / html

答案 33 :(得分:0)

您遇到的问题中,有一部分与我有关。

第三方提供商正在提供REST服务,该服务由其多个客户端使用。这是带有查询参数的直接REST调用,它返回格式正确的JSON。我在PHP和Java上按预期的方式对其进行了测试。

我的客户使用Oracle Service Bus作为他的应用程序服务器和Internet之间的网关。当我进行OSB服务时,它崩溃并显示“无效的消息格式”错误。原来,返回的内容类型是“ text / html”。 OSB按照此标头处理响应;在文本,XML和JSON之间转换。在这种情况下,响应为JSON,但标头并未这么说。联系提供商后,我得到了答复:“我们不会更改它,因为它不会影响其他任何人。”

内容类型标头指定内容应该是什么,而不是实际上是什么。也就是说,在使用程序中,要由您检查或忽略它并以任何方式处理内容。另一个示例,您可以返回GIF数据,但将内容类型指定为JSON,然后继续忽略标头并读取图像数据。这不会伤害您的程序,但可能会伤害其他人。

故事的寓意:玩得开心。

答案 34 :(得分:0)

一些研究

最常见的MIME类型是

application / json

让我们看一个区分json和javascript的示例。

  • application / 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

答案 35 :(得分:-1)

请尝试以下操作并确认

application / json