代码之家  ›  专栏  ›  技术社区  ›  Oli

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

  •  9520
  • Oli  · 技术社区  · 17 年前

    我一直在胡闹 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? 但是我想要一个更有针对性的回答。

    33 回复  |  直到 7 年前
        1
  •  9511
  •   Peter T.    7 年前

    对于JSON文本:

    application/json

    json文本的mime媒体类型为 应用程序/JSON . 默认编码是UTF-8。(来源: RFC 4627 )

    为了 JSONP (可运行的javascript)带回调:

    application/javascript

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

        2
  •  1536
  •   Gowtham Subramaniam    9 年前

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

    当被问到为什么不 text/json 克罗克福德似乎说JSON不是真正的javascript,也不是文本,而且IANA更有可能发布 application/* text/* .

    更多资源:

        3
  •  821
  •   Amal Murali    11 年前

    对于JSON:

    Content-Type: application/json
    

    为了 JSON-P :

    Content-Type: application/javascript
    
        4
  •  604
  •   John Odom    10 年前

    当然,json的正确mime媒体类型是 application/json 但必须认识到应用程序中需要什么类型的数据。

    例如,我使用 Ext GWT 服务器响应必须 文本/ HTML 但包含JSON数据。

    客户端,外部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");
        }
    });
    

    如果使用 应用程序/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);
        }
    };
    
        5
  •  446
  •   BhavikKama    11 年前

    杰森:

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

    例子:

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

    内容类型: application/json


    JSON-P:

    带填充的JSON。 响应是JSON数据,周围环绕着函数调用。

    例子:

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

    内容类型: application/javascript

        6
  •  382
  •   Umpa Gourneau    11 年前

    如果您使用的是Ubuntu或Debian,并且通过Apache提供.json文件,那么您可能希望为这些文件提供正确的内容类型。我这么做主要是因为我想使用火狐扩展 JSONView

    Apache模块 mod_mime 有助于轻松做到这一点。但是,使用Ubuntu,您需要编辑文件 /ETC/MIME类型 加上这条线

    application/json json
    

    然后重新启动Apache:

    sudo service apache2 restart
    
        7
  •  367
  •   Amal Murali    11 年前

    如果从客户端调用ASP.NET Web服务,则必须使用 application/json 让它发挥作用。我相信这对 jQuery Ext 框架。

        8
  •  293
  •   Amal Murali    11 年前

    JSON的正确内容类型是 application/json 除非你用 JSONP 也被称为带填充的JSON,它实际上是JavaScript,因此正确的内容类型应该是 application/javascript .

        9
  •  283
  •   A J A Y shashwat    8 年前

    毫无疑问 application/json 是最好的 MIME 键入JSON响应。

    但我有一些经验 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"/>
    

    通过使用这个,用g-zip压缩了.aspx页,但json响应没有。我补充说

    <add mimeType="application/json" enabled="true"/>
    

    在静态和动态类型部分。 但这根本不压缩JSON响应。

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

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

    在静态和动态类型部分中,并在

    .ashx(异步处理程序)到

    application/x-javascript
    

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

    应用程序/x-javascript
    

    仅当您希望压缩 共享托管环境 . 因为在共享主机中,它们不允许您更改 IIS 配置。

        10
  •  258
  •   Michael Berkowski    12 年前

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

    • 从服务器加载JSON时,Chrome不再发出警告。
    • Firebug会在响应中添加一个标签,显示JSON数据。 格式化的。如果mime类型不同,它将显示为 “响应内容”。
        11
  •  233
  •   Holger Just    12 年前

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

    如果您正在使用 Ext JS 表单提交到上载文件,请注意服务器响应是由浏览器解析的,以便为 <iframe> .

    如果服务器正在使用JSON发送返回对象,那么 Content-Type 标题必须设置为 text/html 以便通知浏览器将未更改的文本插入文档正文。

    the Ext JS 3.4.0 API documentation .

        12
  •  218
  •   djv    11 年前

    JSON是一个 domain-specific language (DSL)和独立于javascript的数据格式,因此有自己的 MIME 类型, application/json . 当然,对mime类型的尊重是由客户机驱动的,所以 text/plain 对于字节的传输可以这样做,但是您将不必要地向供应商应用程序域推送解释。- 应用程序/JSON . 你能通过传送XML吗 文本/平原 ?

    但是,老实说,您选择的mime类型对于客户机来说是关于如何解释数据的建议。- 文本/平原 text/HTML (当它不是HTML时)就像类型擦除——它和用类型语言生成类型对象的所有对象一样不具有格式性。

    我所知道的任何浏览器运行时都不会接受JSON文档,并自动将其作为JavaScript可访问对象提供给运行时,而无需干预,但如果您使用的是一个受损的客户机,则完全不同。但这不是全部- RESTful JSON服务通常没有JavaScript运行时,但它并没有阻止他们使用JSON作为可行的数据交换格式。如果客户是残废的…然后我会考虑通过 Ajax 而是模板化服务。

    应用程序/json!

        13
  •  202
  •   yodabar Arkana    13 年前

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

    正确的HTTP内容类型将是 application/json ,正如其他一些已经突出显示的那样,但是一些客户机处理得不太好,所以jquery建议使用默认值 text/html .

        14
  •  160
  •   Peter Mortensen Pieter Jan Bonestroo    11 年前

    正确答案是:

    Content-Type: application/json
    
        15
  •  157
  •   Jhawins    10 年前

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

    但还没有解释的是,你提出的其他选择意味着什么。

    • application/x-javascript :之前javascript的实验mime类型 application/javascript 标准化了。

    • text/javascript :现在已过时。你应该使用 应用程序/javascript 使用javascript时。

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

    • text/x-json :之前JSON的实验mime类型 应用程序/JSON 正式注册。

    总之,当您对内容类型有任何疑问时,应该检查 this link

        16
  •  140
  •   raja    11 年前

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

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

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

        17
  •  108
  •   George Stocker NotMe    12 年前

    艾斯 application/json _157;是正确的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())
      }
    }
    
        18
  •  98
  •   Jhawins    8 年前

    这个 IANA registration for application/json

    使用此媒体类型的应用程序:json已用于 在用所有这些语言编写的应用程序之间交换数据 编程语言:ActionScript、C、C、Clojure、ColdFusion, 普通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 现在已过时。所以 应用程序/JSON 真的是唯一可能的 对的 回答。

    浏览器支持是另一回事。

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

    更奇怪的是Flickr发送的Content-Type头,它将JSON作为 text/xml . 谷歌使用 文本/ JavaScript 其中一些是Ajax API。

    实例:

    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

        19
  •  83
  •   George Stocker NotMe    12 年前

    正确的mime类型是 application/json

    但是

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

    text/html
    
    application/javascript
    
        20
  •  70
  •   DD_ NiravPatel    12 年前

    我用下面

    contentType: 'application/json',
    data: JSON.stringify(SendData),
    
        21
  •  62
  •   Alexander Burakevych    12 年前

    这个 内容类型 标题应设置为' 应用程序/JSON '过账时。侦听请求的服务器应包括“ 接受=应用程序/json “。 在SpringMVC中,您可以这样做:

    @RequestMapping(value="location", method = RequestMethod.POST, headers = "Accept=application/json")
    

    向响应添加头:

    HttpHeaders headers = new HttpHeaders();
    headers.add("Content-Type", "application/json");
    
        22
  •  55
  •   Peter Mortensen Pieter Jan Bonestroo    12 年前

    Spring 您已经定义了类型: MediaType.APPLICATION_JSON_VALUE 相当于 应用程序/JSON .

        23
  •  55
  •   Nubok eQ19    8 年前

    这个 application/json 在PHP中存储数组或对象非常有用 数据。

    我使用此代码将数据放入json Google Cloud Storage (GCS) 哪个被设置 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"));
    
        24
  •  47
  •   Peter Mortensen Pieter Jan Bonestroo    12 年前

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

    要同时处理这两个问题,最好使用“application/javascript”,而不必担心它是带填充还是不带填充。

        25
  •  47
  •   Rohit Gupta    10 年前

    对于JSON,我使用:

     Content-Type: application/json
    

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

        26
  •  40
  •   community wiki 3 revs, 2 users 96% jgomo3    9 年前

    扩展接受的响应,当您在REST上下文中使用JSON时…

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

    如果你决定跟随 JSONAPI 规范, you should 使用 application/vnd.api+json 如文件所示。

    尽管没有一个通用的标准,但很明显,对正在传输的资源添加的语义使 内容类型 不仅仅是 application/json .

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

        27
  •  39
  •   Peter Mortensen Pieter Jan Bonestroo    11 年前

    PHP开发人员使用:

    <?php
        header("Content-type: application/json");
    
        // Do something here...
    ?>
    
        28
  •  37
  •   MeTitus    9 年前

    如果从JSON中的RESTAPI获取数据,那么必须使用内容类型

    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
    
        29
  •  23
  •   Iresha Rubasinghe    10 年前

    JSON (javascript对象符号)和 JSONP (“带填充的JSON”)格式似乎非常相似,因此可能会非常混淆它们应该使用哪种mime类型。尽管格式看起来非常相似,但它们之间存在一些细微的差异。

    所以每当有任何疑问,我都有非常简单的方法(在大多数情况下都能很好地找到),即去检查相应的RFC文档。

    杰森 RFC 4627 (javascript对象表示法(json)的application/json媒体类型)是json格式的规范。它在第6节中指出,json文本的mime媒体类型是

    application/json.
    

    JSONP JSONP(“带填充的JSON”)在浏览器中的处理方式与JSON不同。JSONP被视为常规的JavaScript脚本,因此它应该使用 application/javascript, javascript的当前官方mime类型。然而,在许多情况下, text/javascript mime类型也可以工作。

    注意 文本/ JavaScript 已被标记为过时 RFC 4329 (脚本媒体类型)文档,建议使用 application/javascript 改为类型。但是,由于遗留的原因, 文本/ JavaScript 仍然被广泛使用,并且它具有跨浏览器支持(这并不总是 应用程序/javascript mime类型,尤其是旧浏览器)。

        30
  •  22
  •   Axifive Sufiyan Ghori    7 年前

    Content-Type: application/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正式注册之前。