Каков правильный тип содержимого JSON? - PullRequest
9715 голосов
/ 25 января 2009

Я какое-то время возился с JSON , просто выкладывал его в виде текста, и это никому не повредило (насколько я знаю), но я бы хотел начать делать что-то должным образом.

Я видел , поэтому многие подразумевали "стандарты" для типа контента JSON:

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

Но какой из них правильный или лучший? Я понял, что между ними существуют проблемы с безопасностью и поддержкой браузера.

Я знаю, что есть похожий вопрос, Какой тип MIME, если JSON возвращается через REST API? , но я бы хотел получить более точный ответ.

Ответы [ 34 ]

9721 голосов
/ 25 января 2009

Для текста в формате JSON:

application/json

Тип носителя MIME для текста JSON: application/json. Кодировка по умолчанию - UTF-8. (Источник: RFC 4627 ).

Для JSONP (исполняемый JavaScript) с обратным вызовом:

application/javascript

Вот некоторые сообщения в блоге, которые были упомянуты в комментариях, которые имеют отношение.

1561 голосов
/ 07 апреля 2010

IANA зарегистрировал официальный тип MIME для JSON как application/json.

На вопрос о том, почему бы не text/json, Крокфорд, похоже, сказал, что JSON на самом деле не является ни JavaScript, ни текстом, а также IANA с большей вероятностью раздаст application/*, чем text/*.

Дополнительные ресурсы:

837 голосов
/ 20 июня 2012

Для JSON:

Content-Type: application/json

Для JSON-P :

Content-Type: application/javascript
612 голосов
/ 07 октября 2009

Конечно, правильный тип носителя MIME для JSON - 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);
    }
};
453 голосов
/ 28 марта 2013

JSON:

Ответ - это динамически генерируемые данные в соответствии с параметрами запроса, переданными в URL.

Пример:

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

Тип содержимого: application/json


JSON-P:

JSON с отступом. Ответ - это данные JSON, с обернутым вызовом функции.

Пример:

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

Тип содержимого: application/javascript

389 голосов
/ 17 ноября 2010

Если вы используете Ubuntu или Debian и обслуживаете файлы .json через Apache, вы можете использовать файлы с правильным типом содержимого. Я делаю это в первую очередь потому, что хочу использовать расширение Firefox JSONView

Модуль Apache mod_mime поможет сделать это легко. Однако в Ubuntu вам нужно отредактировать файл / etc / mime.types и добавить строку

application/json json

Затем перезапустите Apache:

sudo service apache2 restart
373 голосов
/ 25 января 2009

Если вы вызываете ASP.NET Web Services со стороны клиента, вы должны использовать application/json для его работы. Я считаю, что это то же самое для jQuery и Ext фреймворков.

297 голосов
/ 12 апреля 2012

Правильный тип контента для JSON - application/json Если вы не используете JSONP , также известный как JSON с Padding, который на самом деле является JavaScript, и поэтому правильный тип контента будет application/javascript.

286 голосов
/ 18 апреля 2012

Нет сомнений, что 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"/>

Благодаря этому страницы .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 .

260 голосов
/ 30 ноября 2011

Только при использовании application/json в качестве типа MIME у меня есть следующее (по состоянию на ноябрь 2011 года с самыми последними версиями Chrome, Firefox с Firebug ):

  • Больше нет предупреждений от Chrome при загрузке JSON с сервера.
  • Firebug добавит в ответ вкладку, показывающую вам данные JSON отформатирована. Если тип MIME отличается, он будет отображаться как «Содержание ответа».
...