首页 文章

什么是正确的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),