Каков правильный тип контента JSON?

8507
голосов

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

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

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

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

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

задан Oli 25 янв. '09 в 18:25
источник

36 ответов

  • 1
  • 2
8585
голосов

Для текста JSON:

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

Для JSONP с обратным вызовом:

application/javascript

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

ответ дан Gumbo 25 янв. '09 в 18:27
источник
1350
голосов

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

Когда его спросили о том, почему не text/json, Крокфорд, похоже, сказал, что JSON на самом деле не JavaScript, а текст, а IANA скорее всего передаст application/*, чем text/*.

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

ответ дан gnrfan 07 апр. '10 в 7:32
источник
711
голосов

Для JSON:

Content-Type: application/json

Для JSON-P:

Content-Type: application/javascript
ответ дан Alix Axel 20 июня '12 в 6:10
источник
541
голос

Конечно, правильный тип 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);
    }
};
ответ дан Mikhail.Mamaev 07 окт. '09 в 17:35
источник
405
голосов

JSON:

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

Пример:

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

Content-Type: application/json


JSON-P:

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

Пример:

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

Content-Type: application/javascript

ответ дан Bhavin 28 марта '13 в 10:54
источник
350
голосов

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

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

application/json json

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

sudo service apache2 restart
ответ дан Gourneau 17 нояб. '10 в 1:58
источник
337
голосов

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

ответ дан markvpc 25 янв. '09 в 18:31
источник
271
голос

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

ответ дан Resist Design 12 апр. '12 в 7:00
источник
253
голосов

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

ответ дан shashwat 18 апр. '12 в 11:22
источник
240
голосов

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

  • Больше никаких предупреждений от Chrome при загрузке JSON с сервера.
  • Firebug добавит вкладку в ответ, показывающий вам данные JSON отформатирована. Если тип MIME отличается, он будет отображаться как "Содержимое ответа".
ответ дан Ivo Limmen 30 нояб. '11 в 9:42
источник
214
голосов

Не все работает для типа контента application/json.

Если вы используете Ext JS для отправки файла, имейте в виду, что ответ сервера анализируется браузером для создания документа для <iframe>.

Если сервер использует JSON для отправки возвращаемого объекта, то заголовок Content-Type должен быть установлен в text/html, чтобы сообщить браузеру вставить текст без изменений в тело документа.

См. документацию API Ext JS 3.4.0.

ответ дан Conan 07 сент. '11 в 5:41
источник
203
голосов

JSON является доменным языком (DSL) и форматом данных, не зависящим от JavaScript, и, как таковой, имеет свой MIME, application/json. Уважение к типам MIME, конечно, зависит от клиента, поэтому text/plain может делать для передачи байтов, но тогда вы будете излишне толковать интерпретацию домена приложения поставщика - application/json. Передаете ли вы XML через text/plain?

Но, честно говоря, ваш выбор типа MIME - это совет клиенту относительно того, как интерпретировать данные - text/plain или text/HTML (когда он не является HTML) подобен стиранию стилей - он неинформативен, как создание всех ваших объектов типа Object на типизированном языке.

Отсутствие времени выполнения браузера, которое я знаю, займет документ JSON и автоматически сделает его доступным для среды выполнения как объект, доступный для JavaScript, без вмешательства, но если вы работаете с искалеченным клиентом, это совсем другое дело. Но это не вся история. RESTful Сервисы JSON часто не имеют времени автономной работы JavaScript, но это не мешает им использовать JSON в качестве жизнеспособного формата обмена данными. Если клиенты повреждены... тогда я бы подумал, возможно, что HTML-инъекция выполняется с помощью Ajax шаблона.

Применение/JSON!

ответ дан VLostBoy 15 мая '12 в 1:19
источник
189
голосов

Если вы находитесь в среде на стороне клиента, исследование для поддержки кросс-браузера является обязательным для хорошо поддерживаемого веб-приложения.

Правильный HTTP Content-Type будет application/json, поскольку другие уже выделены тоже, но некоторые клиенты не справляются с этим очень хорошо, поэтому jQuery рекомендует использовать по умолчанию text/html.

ответ дан Emanuele Del Grande 27 апр. '12 в 19:27
источник
146
голосов

Правильный ответ:

Content-Type: application/json
ответ дан Irfan DANISH 31 дек. '13 в 9:29
источник
143
голосов

Как и многие другие, application/json - правильный ответ.

Но еще не объяснено, что другие варианты, которые вы предлагаете, означают.

  • application/x-javascript: Экспериментальный тип MIME для JavaScript до application/javascript был стандартным.

  • text/javascript: теперь устарело. Вы должны использовать application/javascript при использовании javascript.

  • text/x-javascript: Экспериментальный тип MIME для вышеуказанной ситуации.

  • text/x-json: экспериментальный тип MIME для JSON до application/json получил официальную регистрацию.

В целом, всякий раз, когда у вас возникают сомнения в отношении типов контента, вы должны проверить эту ссылку

ответ дан fcm 02 апр. '13 в 14:10
источник
128
голосов

В JSP вы можете использовать это в директиве страницы:

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

Правильный тип MIME для JSON - application/json. JSP будет использовать его для отправки ответа клиенту.

ответ дан raja 19 янв. '13 в 11:22
источник
98
голосов

"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())
  }
}
ответ дан Sukane 26 февр. '13 в 14:55
источник
86
голосов

Регистрация IANA для application/json говорит

Приложения, использующие этот тип носителя: JSON используется для    обмен данными между приложениями, написанными во всех этих    языки программирования: ActionScript, C, С#, Clojure, ColdFusion,    Общие 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. Еще более странным является заголовок Content-Type, отправленный Flickr, который возвращает строку JSON с text/xml. Пример Google также включен, отвечая text/html еще одной строкой JSON.

Примеры:

curl -I http://ajax.googleapis.com:80/ajax/services/search/web\?q\=json

Выход: Content-Type: text/html

curl -I https://www.flickr.com/services/rest/?method=flickr.test.echo&format=json&api_key=f82254c1491d894f1204d8408f645a93

Выход: Content-Type: text/xml

ответ дан Jhoverit 12 февр. '14 в 19:12
источник
75
голосов

Правильный тип MIME application/json

НО

Я испытал много ситуаций, когда нужен тип браузера или пользователь фреймворка:

text/html

application/javascript
ответ дан LombaX 03 мая '13 в 19:00
источник
63
голосов

Я использую ниже

contentType: 'application/json',
data: JSON.stringify(SendData),
ответ дан Andro 16 мая '13 в 15:43
источник
57
голосов

Заголовок заголовка 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");
ответ дан Alexander Burakevych 09 авг. '13 в 13:49
источник
51
голос

В Spring у вас есть определенный тип: MediaType.APPLICATION_JSON_VALUE, который эквивалентен application/json.

ответ дан Chand Priyankara 29 июня '13 в 11:34
источник
44
голосов

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"));
ответ дан hyip 01 апр. '15 в 19:13
источник
43
голосов

Если JSON с заполнением, то это будет application/jsonp. Если JSON не имеет дополнения, то это будет application/json.

Чтобы справиться с ними, рекомендуется использовать: "application/javascript", не беспокоясь о том, есть ли это с заполнением или без заполнения.

ответ дан Ankit Zalani 21 июня '13 в 18:22
источник
42
голосов

Для JSON я использую:

 Content-Type: application/json

Это описано в предложении IETF JSON Data Interchange Format 7158, Раздел 1.2: Спецификации JSON.

ответ дан Mehmet_ 06 февр. '15 в 15:01
источник
37
голосов

Если вы получаете данные из REST API в JSON, поэтому вам нужно использовать тип содержимого

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
ответ дан Krishna 11 апр. '16 в 12:15
источник
36
голосов

Разработчики PHP используют это:

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

    // Do something here...
?>
ответ дан user3087089 29 марта '14 в 8:43
источник
35
голосов

Расширение принятых ответов, когда вы используете JSON в контексте REST...

Существует сильный сильный аргумент об использовании application/x-resource+json и application/x-collection+json, когда вы представляете ресурсы и коллекции REST.

И если вы решите следовать спецификации jsonapi, вы должны использовать application/vnd.api+json, как это документировано.

Хотя нет универсального стандарта, ясно, что добавленная семантика передаваемых ресурсов оправдывает более явный Content-Type, чем просто application/json.

Следуя этим соображениям, другие контексты могли бы оправдать более конкретный Content-Type.

ответ дан jgomo3 09 июня '15 в 22:12
источник
20
голосов

JSON (Обозначение объекта JavaScript) и JSONP ( "JSON with padding" ), похоже, очень схожи, и поэтому может быть очень запутанным, какой тип MIME они должны использовать. Несмотря на то, что форматы, похоже, очень похожи, между ними есть некоторые тонкие различия.

Поэтому всякий раз, когда я сомневаюсь, у меня очень простой подход (который отлично работает в большинстве случаев), а именно, идти и проверять соответствующий документ RFC.

JSON RFC 4627 (Тип приложения /json Media для обозначения объектов JavaScript (JSON)) является спецификацией формата JSON. В разделе 6 говорится, что тип мультимедиа MIME для текста JSON

application/json.

JSONP JSONP ( "JSON с дополнением" ) обрабатывается по-разному, чем JSON, в браузере. JSONP рассматривается как обычный JavaScript script, и поэтому он должен использовать application/javascript, текущий официальный MIME-тип для JavaScript. Во многих случаях, однако, тип text/javascript MIME будет работать отлично.

Обратите внимание, что text/javascript помечается как устаревший документ RFC 4329 (Scripting Media Types), и рекомендуется использовать application/javascript вместо этого. Однако из-за унаследованных причин text/javascript по-прежнему широко используется и поддерживает кросс-браузер (что не всегда относится к типу application/javascript MIME, особенно в старых браузерах).

ответ дан Iresha Rubasinghe 15 февр. '16 в 6:20
источник
5
голосов
 Content-type: application/json,json
 Content-Type: application/javascript, json-P
 Content-type: application/x-javascript, javascript
 Content-type: text/javascript, javascript BUT obsolete, older IE versions 
 used to use as html attribute
 Content-type: text/x-javascript, JavaScript Media Types BUT obsolete
 Content-type: text/x-json, json before application/json got officially registered.
ответ дан Kashif Solangi 08 авг. '17 в 6:49
источник
  • 1
  • 2

Другие вопросы по меткам