什麼是正確的JSON內容類型?

What is the correct JSON content type?
投票:9961回答:36

我一直在弄亂JSON一段時間,只是將其作為文本推出,並沒有傷害任何人(據我所知),但是我想正確地做事。

我見過這麼多的所謂的“標準”為JSON內容類型:

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

但是哪一個是正確的,還是最好的? 我發現在它們之間存在安全性和瀏覽器支持問題。

我知道有一個類似的問題, 如果REST API返回JSON,則為哪種MIME類型? ,但我想要一個更有針對性的答案。

tags:json,http-headers,content-type
36回答
304
投票

JSON的正確內容類型是application/json除非您使用JSONP ,也稱為JSON與Padding,它實際上是JavaScript,因此正確的內容類型將是application/javascript


292
投票

毫無疑問, 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配置。


207
投票

如果您在客戶端環境中,則對於良好支持的Web應用程序,必須調查跨瀏覽器的支持。

正確的HTTP Content-Type將是application/json ,因為其他application/json也已經突出顯示,但是某些客戶端不能很好地處理它,因此jQuery建議使用默認的text/html


224
投票

JSON是一種域特定語言 (DSL)和一種獨立於JavaScript的數據格式,因此具有其自己的MIME類型application/json 對MIME類型的尊重當然是由客戶端驅動的,因此text/plain可能會用於字節傳輸,但隨後您將不必要地將解釋推向供應商應用程序域-application application/json 您會通過text/plain傳輸XML嗎?

但老實說,您選擇的MIME類型是向客戶端提供有關如何解釋數據的建議- text/plain text/HTMLtext/HTML (當不是HTML時)就像類型擦除-它與使所有對象成為Object類型一樣沒有信息性以一種打字語言。

據我所知,沒有瀏覽器運行時會使用JSON文檔並自動將其作為JavaScript可訪問的對象供運行時使用,而無需干預,但是如果您使用的是殘廢的客戶端,那就完全不同了。 但是,這並不是整個故事- REST風格的 JSON服務往往沒有JavaScript的運行時間,但使用JSON作為一種可行的數據交換格式它不會阻止他們。 如果客戶端癱瘓了……那麼我可能會考慮通過Ajax模板服務進行HTML注入。

應用程序/ JSON!


857
投票

對於JSON:

Content-Type: application/json

對於JSON-P

Content-Type: application/javascript

166
投票

正確的答案是:

Content-Type: application/json

147
投票

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

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

JSON的正確MIME媒體類型是application/json JSP將使用它來向客戶端發送響應。


113
投票

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

622
投票

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

459
投票

JSON:

響應是根據URL中傳遞的查詢參數動態生成的數據。

例:

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

內容類型: application/json


JSON-P:

帶有填充的JSON。 響應是JSON數據,並帶有包裝的函數調用。

例:

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

內容類型: application/javascript


164
投票

正如許多其他人提到的那樣, application/json是正確的答案。

但是尚未解釋的是您提出的其他選擇的含義。

  • application/x-javascript :在將application/javascript標準化之前,JavaScript的實驗性MIME類型。

  • text/javascript :現已過時。 使用javascript時應使用application/javascript javascript。

  • text/x-javascript :以上情況的實驗性MIME類型。

  • text/x-json :正式註冊application/json之前,用於JSON的實驗MIME類型。

總而言之,每當對內容類型有疑問時,都應檢查此鏈接


88
投票

正確的MIME類型是application/json

我遇到了許多情況,其中瀏覽器類型或框架用戶需要:

text/html

application/javascript

74
投票

我用下面

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

49
投票

如果JSON帶有填充,則它將為application/jsonp 如果JSON不帶填充,則它將為application/json

要同時處理這兩種情況,最好使用:'application / javascript',而不必理會是使用填充還是不使用填充。


58
投票

Spring中,您有一個定義的類型: MediaType.APPLICATION_JSON_VALUE ,它等效於application / json


65
投票

發佈時, 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");

107
投票

IANA註冊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 沒有列出任何其他這些媒體類型 ,實際上甚至application/javascript現在已經過時了。 因此, application/json實際上是唯一可能的正確答案。

瀏覽器支持是另一回事。

支持最廣泛的非標準媒體類型是text/jsontext/javascript 但是一些大牌甚至使用text/plain

更奇怪的是Flickr發送的Content-Type標頭,後者返回JSON作為text/xml Google對某些ajax API使用了text/javascript

例子:

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


41
投票

PHP開發人員使用此命令:

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

    // Do something here...
?>

1582
投票

IANA已將JSON的正式MIME類型註冊為application/json

當被問及為什麼不是text/json ,Crockford似乎說JSON並不是JavaScript也不是text,而且IANA比text/*更有可能分發application/* text/*

更多資源:


49
投票

對於JSON,我正在使用:

 Content-Type: application/json

在IETF的JSON數據交換格式7158提案的第1.2節:JSON規範中對此進行了描述。


57
投票

application/json在PHP中可很好地用於存儲數組或對像數據。

我使用此代碼將數據以JSON格式放置在可公開查看的 Google Cloud Storage(GCS)上:

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

42
投票

在REST上下文中使用JSON時擴展接受的響應...

當您代表REST資源和集合時,關於使用application/x-resource+jsonapplication/x-collection+json 爭論強烈

而且,如果您決定遵循jsonapi規範, 則應使用application/vnd.api+json ,因為該文檔已記錄。

儘管還沒有一個通用的標準,但是很明顯,向正在傳輸的資源中添加的語義證明了比application/json更明確的Content-Type是合理的。

按照這種推理,其他上下文可以證明更具體的Content-Type是合理的。


25
投票

JSON (JavaScript對象表示法)和JSONP (“帶填充的JSON”)格式似乎非常相似,因此可能會使他們應該使用哪種MIME類型感到非常困惑。 即使格式相似,它們之間也存在一些細微的差異。

因此,每當有任何疑問時,我都有一個非常簡單的方法(在大多數情況下效果很好),即檢查相應的RFC文檔。

JSON 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類型也可以正常工作。

請注意, RFC 4329 (腳本媒體類型)文檔已將text/javascript標為過時,建議改用application/javascript類型。 但是,由於遺留原因, text/javascript仍被廣泛使用,並且具有跨瀏覽器支持( application/javascript MIME類型並不總是這樣,尤其是對於較舊的瀏覽器)。


38
投票

如果您從REST API中以JSON獲取數據,則必須使用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

397
投票

如果您使用的是Ubuntu或Debian,並且通過Apache提供.json文件,則可能需要提供具有正確內容類型的文件。 我這樣做主要是因為我想使用Firefox擴展JSONView

Apache模塊mod_mime將幫助您輕鬆完成此任務。 但是,在Ubuntu中,您需要編輯/etc/mime.types文件並添加以下行

application/json json

然後重新啟動Apache:

sudo service apache2 restart

25
投票

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正式註冊application / json之前的json。


10016
投票

對於JSON文本:

application/json

JSON文本的MIME媒體類型為application/json 默認編碼為UTF-8。 (來源: RFC 4627 )。

對於帶回調的JSONP (可運行的javascript):

application/javascript

這是相關評論中提到的一些博客文章。


381
投票

如果要從客戶端調用ASP.NET Web服務,則必須使用application/json使其正常工作。 我相信這對於jQueryExt框架是相同的。


241
投票

並非所有內容都適用於內容類型application/json

如果您正在使用Ext JS表單提交來上傳文件,請注意,瀏覽器會解析服務器響應以創建<iframe>的文檔。

如果服務器使用JSON發送返回對象,則必須將Content-Type標頭設置為text/html ,以告知瀏覽器將未更改的文本插入文檔主體。

請參閱Ext JS 3.4.0 API文檔


266
投票

僅當使用application/json作為MIME類型時,我才具有以下內容(截至2011年11月,使用最新版本的Chrome,Firefox和Firebug ):

  • 從服務器加載JSON後,Chrome將不再發出警告。
  • Firebug將在響應中添加一個標籤,向您顯示格式化的JSON數據。 如果MIME類型不同,它將僅顯示為“響應內容”。

©2020 sofbug.com - All rights reserved.