正しいJSONコンテンツタイプは何ですか?


10255

私はしばらくの間、JSONをいじくり回していて、それをテキストとして押し出すだけで、誰も害を与えていません(私が知っていることです)が、適切に処理を開始したいと思います。

JSONコンテンツタイプの「標準」と呼ばれるものをたくさん見ました。

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

しかし、どちらが正しいですか、それとも最良ですか?私はそれらの間で異なるセキュリティとブラウザのサポート問題があることを収集します。

同様の質問があることを知っています。JSONがREST APIによって返されている場合どのMIMEタイプですか?、でももう少し的を絞った回答をお願いします。

回答:


10310

JSONテキストの場合:

application/json

JSONテキストのMIMEメディアタイプはapplication/jsonです。デフォルトのエンコーディングはUTF-8です。(出典:RFC 4627)。

以下のためのJSONPコールバックを持つ(実行可能なジャバスクリプト):

application/javascript

以下は、関連するコメントで言及されたいくつかのブログ投稿です。



Jsonテキストを一緒にファイルを送信できますか?
OPV 2017

7
Internet Explorerでapplication / jsonに関する問題が発生することがある-ブログがオフラインになっている
kudlatiger

6
プレーンテキストを含む誰かが書いたドキュメントがあるとします。これで、プレーンテキストもたまたま有効なJSONになります。次に、MIMEタイプとしてtext / plainを使用するのは間違っていますか?JSONはテキストのサブタイプです。ですから、どちらも許可されるべきだと思います。問題は、実際にはどちらがうまく機能するかです。codetoshare IEによるコメントによると、IEはapplication / jsonに問題があります。しかし、どのブラウザもtext / plainに問題があるべきではありません。text / plainが安全でない場合、どうすればWebサイトからテキストファイルを提供できますか?
Panu Logic 2018

5
@EugenMihailescuそのページのタイトルは「MIMEタイプの不完全なリスト」です
Omegastick '30 / 08/30

1617

IANAはJSONの公式MIMEタイプをとして登録していますapplication/json

なぜそうではないのかと尋ねられたときtext/json、CrockfordはJSONは実際にはJavaScriptでもテキストでもない、そしてIANAはよりも配布する可能性が高いと言ったようapplication/*ですtext/*

その他のリソース:


166
text/*早い段階で多くのものがセクションに入れられましたが、おそらく最近セクションに入れられるでしょうapplication/*
TRiG、2011

29
@Rohmer-テキストエディターで何でも開くことができますが、JPEG、Windows .exe、.zipなどのバイナリ形式には、実際には多くのテキストエディターを壊したり、望ましくない動作を引き起こしたりする可能性のある印刷できない文字が含まれます。cat file.jpgたとえば実行してみてください。一方、xmlまたはjsonファイルは100%印刷可能です。だから、はい、遅すぎて今は変えられないという事実にもかかわらず、Stijn de Wittのポイントは有効なものだと思います。
XP84

4
@ XP84テキストエディタで任意のバイナリをHEX形式で開くことができます。そして、すべての異なる文字(そのうちの16文字)は100%印刷可能です。それで、そのロジックによって... すべてのバイナリはテキストですか? Jsonはテキストではありません。Jsonは(警告:非公式の緩やかな定義)オブジェクト(またはオブジェクトの配列のテキスト表現
xDaizu

5
「HEX形式のテキストエディター」というフレーズには意味がありません。16進エディタは、各バイトを16進値として表示します。たとえば、バイト1111000は「78」として表示されます。たまたま16進編集モードを備えたテキストエディターがいくつかあるかもしれませんが、これは、最も技術的なタスクを実行している最も技術的なユーザー以外には一般的でもないし、役に立ちません。比較すると、テキストはASCIIまたはUnicodeを意味し、テキストでは、バイト1111000は小文字を意味しxます。78ではありません。JSONはHTMLとまったく同じようにテキストです(text / html)。構造化された意味を持つ読み取り可能なテキスト文字のみが含まれています。
XP84

11
Stijn de Wittに同意する傾向があります。JSONは、テキストエディターで表示および編集するためのものです。
Panu Logic 2018


632

もちろん、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);
    }
};

7
サーバーの応答は、text / htmlとして送信する必要があります。これは、ExtJSバリアントにも当てはまります。
gbegley 2012年

463

JSON:

応答は、URLで渡されたクエリパラメータに従って動的に生成されたデータです。

例:

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

コンテンツタイプ: application/json


JSON-P:

パディング付きのJSON。応答はJSONデータであり、関数呼び出しがラップされています。

例:

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

コンテンツタイプ: application/javascript


46
JSONの定義が間違っています。動的に生成したり、クエリパラメータを考慮する必要はありません。静的JSONファイルを提供できます。また、最も支持されている回答にはRFCへのリンクがあります。
スタイル

10
また、JSONPは、varに割り当てられたjsonデータにすることもできます。
ジミー・ケイン

401

UbuntuまたはDebianを使用していて、Apacheを介して.jsonファイルを提供する場合は、正しいコンテンツタイプでファイルを提供することができます。これは主に、Firefox拡張機能JSONViewを使用したいためです。

Apacheモジュールmod_mimeは、これを簡単に行うのに役立ちます。ただし、Ubuntuでは、/ etc / mime.typesファイルを編集して次の行を追加する必要があります。

application/json json

次に、Apacheを再起動します。

sudo service apache2 restart

44
通常はリロードで十分です(再起動より高速)。また、「sudo service apache2 reload」を実行できるようになりました。
noamtm

19
Ubuntu 12.04にはデフォルトでこれがあります
Prizoff

386

ASP.NET Webサービスをクライアント側から呼び出す場合はapplication/json、それを機能させるために使用する必要があります。これはjQueryExtフレームワークでも同じだと思います。


20
jQueryは少なくとも「application / json」と「text / plain」で動作するようです...私は他のすべてを試したことはありません。
ネイサン

jQueryのでの作業が可能でcontent-Type: text/plaincontent-Type: application/jsoncontent-Type: application/json; charset=UTF-8contentType: "application/x-www-form-urlencoded; charset=UTF-8"
Ashraf.Shk786

307

JSONの適切なコンテンツタイプapplication/jsonは、JSONP(パディング付きJSONとも呼ばれます)を使用している場合を除き、実際にはJavaScriptなので、適切なコンテンツタイプはですapplication/javascript


296

それがJSON応答にapplication/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構成を変更できないためです。


11
「ですから、個人的にapplication / x-javascriptを使用することをお勧めします」というのは、この答えが誤解を招く原因になります。GoDaddy はの圧縮を許可application/jsonします。私は共有ホスティングでそれを利用します。とにかく、異なるコンテンツタイプを使用して圧縮を有効にすることはお勧めしません。それは単に間違っています。それはできますが、それでも間違いです。ブラウザーのサポートに異なるコンテンツタイプを使用することも、サーバー側の圧縮に異なるコンテンツタイプを使用することも1つです。

269

MIMEタイプapplication/jsonとして使用する場合のみ、次のものが用意されています(2011年11月現在、最新バージョンのChrome、Firebugを搭載したFirefox )。

  • サーバーからJSONが読み込まれたときにChromeから警告が出なくなりました。
  • Firebugは、フォーマットされたJSONデータを示すタブを応答に追加します。MIMEタイプが異なる場合、「応答コンテンツ」として表示されます。

244

すべてがコンテンツタイプで機能するわけではありませんapplication/json

Ext JSフォーム送信を使用してファイルをアップロードする場合は、サーバーの応答がブラウザによって解析され、のドキュメントが作成されることに注意してください<iframe>

サーバーがJSONを使用して戻りオブジェクトを送信する場合、変更されていないテキストをドキュメントの本文に挿入するようにブラウザーに指示するには、Content-Typeヘッダーをに設定する必要がありますtext/html

Ext JS 3.4.0 APIのドキュメントを参照してください。


40
標準に準拠していないツールは、可能な限り避けてください。application/json仕様ごとに使用。
one.beat.consumer 2012

15
@ one.beat.consumerはtrueですが、ExtJ自体に固有のものではありません。これはブラウザの制限です(または、おそらく「セキュリティ対策」)。
ヘンディイラワン

7
確かに、text / plainを使用して、HTML以外のコンテンツにHTMLセマンティクスを適用しない方が良いでしょう。それとも、DOMがない場合、ブラウザでフレームのコンテンツを抽出できないのですか?
シンクロ

5
さらに混乱を追加するには:私は、デフォルトのブラウザでサムスンギャラクシービーム(アンドロイド2.3)に類似したケースをデバッグしていて、iframe火災に思えるloadのイベントapplication/javascriptapplication/x-javascripttext/javascripttext/plain、しかし、NOTのためにそれを焼成application/jsontext/html。現在、Android <= 2.3はAndroidマーケットシェアの約50%です。
jakub.g 2013

226

JSONはドメイン固有言語(DSL)であり、JavaScriptに依存しないデータ形式であるため、独自のMIMEタイプを持っていapplication/jsonます。もちろんMIMEタイプの尊重はクライアント主導でtext/plain行われるため、バイトの転送に影響する可能性がありますが、その場合、不必要にベンダーアプリケーションドメインへの解釈を押し上げることになりますapplication/json。経由でXMLを転送しますtext/plainか?

しかし正直なところ、MIMEタイプの選択は、データを解釈する方法に関するクライアントへのアドバイスです- (text/plainまたはtext/HTML(HTMLでない場合)タイプの消去のようなものです-タイプされた言語でObjectタイプのすべてのオブジェクトを作成するのと同じくらい有益ではありません。

私が知っているブラウザランタイムはJSONドキュメントを取り、介入なしにJavaScriptでアクセス可能なオブジェクトとして自動的にランタイムで利用できるようにしますが、障害のあるクライアントで作業している場合は、まったく別の問題です。しかし、それは全体のstory-ではありませんRESTfulな JSONサービスは、多くの場合、JavaScriptのランタイムを持っていないが、それは実行可能なデータ交換フォーマットとしてJSONを使用してそれらを停止しません。クライアントがそのように機能していない場合は、AjaxテンプレートサービスによるHTMLインジェクションを検討することを検討します。

アプリケーション/ JSON!


210

クライアント側の環境にいる場合、十分にサポートされているWebアプリケーションでは、クロスブラウザサポートについて調査することが必須です。

application/json他の人がすでに強調表示しているように、適切なHTTP Content-Typeはになりますが、一部のクライアントはそれをうまく処理しないため、jQueryがデフォルトを推奨していますtext/html



166

他の多くの人が述べたように、それapplication/jsonが正解です。

しかし、まだ説明されていないのは、提案した他のオプションの意味です。

  • application/x-javascript:以前application/javascriptはJavaScriptの実験的なMIMEタイプが標準化されていました。

  • text/javascript:廃止されました。application/javascriptJavaScript を使用する場合に使用する必要があります。

  • text/x-javascript:上記の状況での実験的なMIMEタイプ。

  • text/x-jsonapplication/json正式に登録される前の、JSONの試験的なMIMEタイプ。

全体として、コンテンツタイプについて疑問がある場合は、必ずこのリンクを確認してください。


15
いつtext/javascript廃止されましたか?HTMLドキュメントを<script type="text/javascript" ...タグで埋めています。
Oli 2013

7
ブラウザーにとってはまったく違いはありません。RFC標準では廃止されています:rfc-editor.org/rfc/rfc4329.txt
fcm

16
@Oliあなたは安全にドロップtype="text/javascript"<script>...</script>、少なくともHTML5に従って行うことができます。
TCB13 2013年

149

ではJSPは、pageディレクティブでこれを使用することができます。

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

JSON の正しいMIMEメディアタイプはapplication/jsonです。JSPは、クライアントに応答を送信するためにそれを使用します。


115

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

112

ためapplication/jsonIANA登録は言う

このメディアタイプを使用するアプリケーション: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/jsonまたはtext/javascriptです。しかし、いくつかの有名人も使用していますtext/plain

さらに奇妙なのは、JSONをとして返すFlickrによって送信されたContent-Typeヘッダーtext/xmlです。Googleはtext/javascriptajax 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


90

正しいMIMEタイプは application/json

だが

ブラウザの種類またはフレームワークのユーザーが必要とする多くの状況を経験しました:

text/html

application/javascript

10
そのような状況の例は?
Mark Amery 2014年

75

以下を使用します

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

66

コンテンツは-TYPEヘッダが「に設定する必要があるアプリケーション/ 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");


59

application/json配列やオブジェクトデータを格納するためにPHPで素晴らしい作品。

私はこのコードを使用して、パブリックに表示可能に設定されているGoogle Cloud Storage(GCS)の 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"));

50

JSONにパディングが付いている場合は、パディングになりますapplication/jsonp。JSONにパディングがない場合は、パディングになりますapplication/json

両方を処理するには、パディングがあるかどうかに関係なく、「application / javascript」を使用することをお勧めします。


8
あなたの答えの最初の部分は間違っています。「application / jsonp」は有効なMIMEタイプではありません。JSONPの応答本文は単なるJavaScriptであるため、JavaScriptのMIMEタイプの1つを使用する必要があります。
Rob W


43

RESTコンテキストでJSONを使用している場合の、受け入れられた応答の拡張...

RESTリソースとコレクションをいつどのように表現するかについては、強い議論があります。application/x-resource+jsonapplication/x-collection+json

また、jsonapi仕様に従うことを決定した場合は、ドキュメントに記載されているように、を使用する必要application/vnd.api+jsonがあります。

普遍的な標準がないAltough、より明確な正当化転送されてリソースにセマンティック追加することは明らかであるContent-Typeの単なるをapplication/json

この推論に続いて、他のコンテキストはより具体的なContent-Typeを正当化できます。


3
application/vnd.api+jsonjson:apiを使用するAPI専用であるように思われます。これは、独自の期待と形式を持つ非常に狭い仕様であり、jsonを返すすべての API については理解できません。私が間違っている場合は修正してください
Hilikus


39

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

28

Content-Type: application/json-json
Content-Type: application/javascript-json-P
Content-Type: application/x-javascript-javascript
Content-Type: text/javascript-javascriptただし、HTML属性として使用するために使用されていた古いIEバージョン。
Content-Type: text/x-javascript-JavaScriptメディアタイプが廃止
Content-Type: text/x-jsonされました-application / jsonが正式に登録される前のjson。


JSONテキストの場合:application / json Content-Type:application / json
Vikash Chauhan

28

JSON(JavaScript Object Notation)およびJSONP( "JSON with padding")のフォーマットは非常に似ているため、どのMIMEタイプを使用するか非常に混乱する可能性があります。フォーマットは似ていますが、それらの間には微妙な違いがあります。

したがって、疑問がある場合はいつでも、私は非常にシンプルなアプローチ(ほとんどの場合、完全に正常に機能します)を行います。つまり、対応するRFCドキュメントを確認します。

JSON RFC 4627(JavaScript Object Notation(JSON)のapplication / json Media Type)は、JSON形式の仕様です。セクション6では、JSONテキストのMIMEメディアタイプは

application/json.

JSONP JSONP(「JSON with padding」)は、ブラウザーではJSONとは異なる方法で処理されます。JSONPは通常のJavaScriptスクリプトとして扱われるため、JavaScript application/javascript,の現在の公式MIMEタイプを使用する必要があります。ただし、多くの場合、text/javascriptMIMEタイプも問題なく機能します。

text/javascriptによって廃止されたとしてマークされているRFC 4329(スクリプティングメディアタイプ)文書とそれが使用することを推奨しapplication/javascript代わりにタイプ。ただし、レガシーの理由により、text/javascriptはまだ広く使用されており、クロスブラウザーのサポートがあります(これは、application/javascriptMIMEタイプの場合、特に古いブラウザーの場合に常に当てはまるわけではありません)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.