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

私は以前から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? がありますが、もう少し的を射た回答が欲しいところです。

ソリューション

JSONテキストの場合。

application/jsonの場合

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

コールバック付きのJSONP(実行可能なjavascript)の場合。

application/javascript`の場合

コメントで言及されたブログ記事のうち、関連するものを紹介します。

解説 (8)

もちろん、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]2を使用したサーバーサイドのソースコードスニペットです。

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);
    }
};
解説 (1)

クライアントサイドからASP.NET Webサービスを呼び出す場合、application/jsonを使用しないと動作しません。これはjQueryExtのフレームワークでも同じだと思います。

解説 (2)