首页 文章

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

提问于
浏览
9402

我已经习惯了JSON已经有一段时间了,只是把它作为文本推出来,并且它还没有开始正确地做事 .

我见过很多声称"standards"的JSON内容类型:

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

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

我知道有一个类似的问题,但是我想要一个稍微有针对性的答案 .

30 回答

  • 39

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

  • 54

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

    JSON:

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

    Example:

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

    Content-Type: application/json


    JSON-P:

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

    Example:

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

    Content-Type: application/javascript

  • 37

    JSON(JavaScript Object Notation)和JSONP("JSON with padding")格式似乎非常相似,因此它们应该使用哪种MIME类型可能会非常混乱 . 即使格式看起来非常相似,但它们之间存在一些细微差别 .

    因此,无论什么时候怀疑,我都有非常简单的方法(在大多数情况下都可以很好地找到),即去检查相应的RFC文档 .

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

    application/json.
    

    JSONP JSONP("JSON with padding")在浏览器中的处理方式与JSON不同 . JSONP被视为常规JavaScript脚本,因此它应该使用 application/javascript, 当前JavaScript的官方MIME类型 . 但是,在许多情况下, text/javascript MIME类型也可以正常工作 .

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

  • 807

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

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

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

    the Ext JS 3.4.0 API documentation .

  • 366

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

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

  • 291

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

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

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

  • 9402

    正确的MIME类型是 application/json

    BUT

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

    text/html
    
    application/javascript
    
  • 62

    对于JSON,我正在使用:

    Content-Type: application/json
    

    这在IETF的JSON数据交换格式7158提案Section 1.2: Specifications of JSON中有所描述 .

  • 438

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

    当您表示REST资源和集合时,有一个strong argument关于使用 application/x-resource+jsonapplication/x-collection+json .

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

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

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

  • 155

    For JSON:

    Content-Type: application/json
    

    For JSON-P:

    Content-Type: application/javascript
    
  • 97

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

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

    更多资源:

  • 255

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

    我使用此代码将数据放在Google Cloud Storage (GCS)上的JSON中,设置为publically viewable

    $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"));
    
  • 107

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

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

  • 70

    我用下面的

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

    Content-Type Headers 应设置为' 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");
    
  • 596

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

    但老实说,你选择的MIME类型是建议客户端如何解释数据 text/plaintext/HTML (当它's not HTML) is like type erasure- it's没有信息,因为在类型语言中使用Object类型的所有对象 .

    我所知道的浏览器运行时没有采用JSON文档并自动将其作为JavaScript可访问对象提供给运行时而无需干预,但如果您正在使用残缺客户端,那么's an entirely different matter. But that'不是全部故事 - RESTful JSON服务经常不会't have JavaScript runtimes, but it doesn' t使用JSON作为可行的数据交换格式来阻止它们 . 如果客户端瘫痪...那么我会考虑通过Ajax模板服务进行HTML注入 .

    应用程序/ JSON!

  • 378

    正如许多人提到的那样, application/json 是正确的答案 .

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

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

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

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

    • text/x-json :在 application/json 正式注册之前,JSON的实验MIME类型 .

    总而言之,无论何时您对内容类型有任何疑问,都应该检查this link

  • 21

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

  • 200

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

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

  • 232

    毫无疑问, 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"/>
    

    在静态和动态类型部分 . But this does not compress JSON responses at all.

    之后我删除了这个新添加的类型并添加了

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

    在静态和动态类型部分中,并更改了响应类型

    .ashx(异步处理程序)来

    application/x-javascript
    

    现在我发现我的JSON响应是用g-zip压缩的 . 所以我个人建议使用

    application/x-javascript
    

    仅当您要在 shared hosting environment 上压缩JSON响应时 . 因为在共享主机中,它们不允许您更改IIS配置 .

  • 47

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

    • 从服务器加载JSON时,Chrome不再发出警告 .

    • Firebug将在响应中添加一个选项卡,显示格式化的JSON数据 . 如果MIME类型不同,它将显示为'Response content' .

  • 280

    对于JSON文本:

    application/json

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

    对于带回调的JSONP(runnable javascript):

    application / javascript

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

  • 1510

    正确答案是:

    Content-Type: application/json
    
  • 158

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

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

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

    application/json json
    

    然后重启Apache:

    sudo service apache2 restart
    
  • 47

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

  • 39

    IANA registration for application/json

    使用此媒体类型的应用程序:JSON已用于在使用所有这些编程语言编写的应用程序之间交换数据:ActionScript,C,C#,Clojure,ColdFusion,Common Lisp,E,Erlang,Go,Java,JavaScript,Lua,目标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 . 谷歌使用 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

  • 217

    PHP开发人员使用它:

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

相关问题