Каков правильный тип содержимого JSON?

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

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

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

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

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

25.01.2009 15:25:19
30 ОТВЕТОВ
РЕШЕНИЕ

Для текста JSON:

application/json

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

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

application/javascript

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

10238
7.05.2019 08:52:06
Eugen Mihailescu 4.04.2017 05:08:21
Могу ли я отправить файл вместе с текстом Json?
OPV 23.07.2017 19:42:07
В Internet Explorer иногда
kudlatiger 4.06.2018 03:59:07
Представьте, что у меня есть документ, написанный кем-то, который содержит простой текст. Теперь этот простой текст также является допустимым JSON. Буду ли я тогда неправильно использовать text / plain в качестве mime-типа? JSON - это ПОДПИСЬ текста. Поэтому я думаю, что оба должны быть разрешены. Вопрос в том, что лучше работает на практике. Согласно комментарию codetoshare IE имеет проблемы с приложением / JSON. Но ни у одного браузера не должно быть проблем с текстом / текстом. Если text / plain небезопасен, как я могу подавать текстовые файлы с моего веб-сайта?
Panu Logic 1.09.2018 16:08:08
@EugenMihailescu Заголовок этой страницы - «Неполный список типов MIME»
Omegastick 30.08.2019 06:30:53

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

386
27.05.2014 02:38:18
Кажется, jQuery работает по крайней мере с «application / json» и «text / plain» ... Хотя я не пробовал все остальные.
Nathan 18.03.2010 19:30:13
JQuery способен работать с content-Type: text/plain, content-Type: application/json, content-Type: application/json; charset=UTF-8, contentType: "application/x-www-form-urlencoded; charset=UTF-8"
Ashraf.Shk786 27.07.2017 11:13:43

Конечно, правильный тип носителя MIME для JSON есть application/json, но необходимо понимать, какой тип данных ожидается в вашем приложении.

Например, я использую Ext GWT, и ответ сервера должен идти как text / html, но содержит данные JSON.

Клиентская сторона, прослушиватель Ext GWT form

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);
    }
};
631
4.05.2015 22:37:14
ответ сервера должен быть в виде текста / HTML. Это верно и для варианта ExtJS.
gbegley 30.10.2012 21:10:05

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

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

Больше ресурсов:

1610
17.01.2017 20:53:54
Много вещей было помещено в text/*раздел в первые дни, которые, вероятно, будут помещены в application/*раздел в эти дни.
TRiG 5.07.2011 20:47:12
@Rohmer - Вы можете «открыть» что угодно в текстовом редакторе, но двоичный формат, такой как JPEG или Windows .exe или .zip, будет содержать непечатаемые символы, которые могут фактически сломать многие текстовые редакторы или вызвать нежелательное поведение. Попробуйте запустить, cat file.jpgнапример. Принимая во внимание, что любой файл XML или JSON на 100% для печати. Поэтому я думаю, что точка зрения Стийна де Витта является верной, несмотря на то, что да, уже слишком поздно что-либо менять.
XP84 16.01.2018 20:59:19
@ XP84 Вы можете открыть любой двоичный файл с помощью текстового редактора в форме HEX. И все разные символы (16 из них) на 100% для печати. Итак, по этой логике ... все ли текстовые файлы? Джсон не текст. Json - это (предупреждение: неформальное свободное определение впереди) текстовое представление объекта (или массива объектов)
xDaizu 5.04.2018 11:55:44
Нет смысла в фразе "текстовый редактор в шестнадцатеричной форме". Шестнадцатеричный редактор показывает каждый байт как шестнадцатеричное значение, например, байт 1111000 как «78». Хотя могут существовать некоторые текстовые редакторы, которые также имеют режим редактирования в шестнадцатеричном формате, это не является ни обычным, ни полезным для кого-либо, кроме большинства технических пользователей, выполняющих большинство технических задач. Текст для сравнения означает ASCII или Unicode, а в тексте байт 1111000 означает символ нижнего регистра x. Не 78. JSON - это текст точно так же, как HTML (text / html). Он содержит только читаемые текстовые символы со структурированным значением в них.
XP84 21.05.2018 21:53:54
Я склонен согласиться со Стейном де Виттом. JSON предназначен для просмотра и редактирования в текстовом редакторе.
Panu Logic 1.09.2018 15:59:36

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

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

application/json json

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

sudo service apache2 restart
401
30.06.2014 16:56:26
обычно достаточно перезагрузки (быстрее, чем перезапуск). Также обратите внимание, что теперь вы можете выполнить «sudo service apache2 reload».
noamtm 19.01.2011 17:37:04
Ubuntu 12.04 имеет это по умолчанию
Prizoff 25.05.2012 17:52:09

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

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

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

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

244
2.08.2013 15:53:02
По возможности следует избегать использования инструментов, которые не соответствуют стандартам; использовать application/jsonпо спецификации.
one.beat.consumer 16.02.2012 02:05:08
@ one.beat.consumer, хотя это так, но это не относится к ExtJ как таковым. Это ограничение браузера (точнее, возможно, «мера безопасности»).
Hendy Irawan 24.02.2012 15:54:58
Конечно, было бы лучше использовать text / plain, чтобы он не применял семантику HTML к контенту, отличному от HTML? Или браузеры не позволяют извлекать содержимое фрейма, если у него нет DOM?
Synchro 10.08.2012 12:34:46
Для того, чтобы добавить еще большую путаницу: я просто отладки подобный случай на Samsung Galaxy Beam (Android 2.3) с браузером по умолчанию, и , iframeкажется, огнем loadсобытие для application/javascript, application/x-javascript, text/javascript, text/plain, но НЕ обжиг для application/jsonни text/html. На сегодняшний день Android <= 2.3 составляет около 50% доли рынка Android.
jakub.g 5.07.2013 12:41:45

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

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

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

307
27.05.2014 02:39:25

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

296
9.11.2017 08:31:59
«Так что я лично рекомендую использовать application / x-javascript», где этот ответ вводит в заблуждение. GoDaddy делает позволить сжатие application/json, я использовать его на мой виртуальный хостинг , и я бы не советовал использовать другой тип контента , чтобы включить сжатие в любом случае, это просто неправильно. Это можно сделать, но все равно будет неправильно. Использование разных типов контента для поддержки браузера - это одно, а использование разных типов контента для сжатия на стороне сервера - это другое.
user1596138 11.12.2014 16:20:25

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

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

210
23.02.2013 15:37:55

JSON является предметно-ориентированным языком (DSL) и форматом данных, независимым от JavaScript, и поэтому имеет свой собственный тип MIMEapplication/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!

226
11.12.2014 16:48:17

Для JSON:

Content-Type: application/json

Для JSON-P :

Content-Type: application/javascript
882
27.05.2014 02:35:38
JSONP на самом деле не JSON, это техника для передачи литерала объекта JavaScript
Benjamin Gruenbaum 8.09.2013 06:44:30

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

Content-Type: application/json
170
22.11.2014 11:11:31

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

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

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

149
5.08.2014 07:08:05

« 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())
  }
}
115
25.02.2014 17:59:57

JSON:

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

Пример:

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

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


JSON-P:

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

Пример:

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

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

463
1.08.2014 13:09:43
Определение JSON неверно. Его не нужно динамически генерировать или соблюдать параметры запроса. Вы можете обслуживать статический файл JSON. Кроме того, самый голосующий ответ имеет ссылку на RFC.
styfle 29.01.2014 01:37:32
Также JSONP может быть данными json, назначенными для переменной.
Jimmy Kane 30.01.2014 13:16:57

Как уже упоминали многие, 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был официально зарегистрирован.

В общем, когда у вас есть какие-либо сомнения относительно типов контента, вы должны проверить эту ссылку

166
17.08.2015 20:05:26
Когда text/javascriptстал устаревшим? Я все еще заполняю HTML-документы <script type="text/javascript" ...тэгами.
Oli 2.04.2013 12:23:12
Это не имеет никакого значения для браузеров, на самом деле. Это просто устарело для стандартов RFC: rfc-editor.org/rfc/rfc4329.txt
fcm 2.04.2013 12:34:43
@ Оли вы можете смело бросать type="text/javascript"и просто делать <script>...</script>по крайней мере в соответствии с HTML5.
TCB13 27.06.2013 21:41:03

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

НО

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

text/html

application/javascript
90
25.02.2014 17:59:47
Пример такой ситуации?
Mark Amery 4.06.2014 19:29:55

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

contentType: 'application/json',
data: JSON.stringify(SendData),
75
17.05.2013 09:52:13

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

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

50
10.07.2013 22:16:37
Первая часть вашего ответа неверна. "application / jsonp" не является допустимым типом MIME. Тело ответа JSONP - это просто JavaScript, поэтому необходимо использовать один из MIME-типов для JavaScript.
Rob W 30.08.2013 16:14:44

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

59
10.07.2013 22:17:11
Это тоже Java EE :: javax.ws.rs.core.MediaType
Eddie B 28.02.2014 03:01:06

Content-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");
66
9.08.2013 10:49:18

Регистрации 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/jsonили text/javascript. Но некоторые громкие имена даже используют text/plain.

Еще более странным является заголовок Content-Type, отправленный Flickr, который возвращает JSON как text/xml. Google использует text/javascriptдля некоторых из них ajax apis.

Примеры:

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

112
12.04.2018 15:49:49

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

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

    // Do something here...
?>
42
19.07.2014 21:49:42

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

 Content-Type: application/json

Это описано в предложении IETF о формате обмена данными JSON 7158, раздел 1.2: спецификации JSON .

50
2.01.2016 04:03:22

Отлично 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"));
59
17.01.2018 02:33:44

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

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

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

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

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

43
27.07.2016 00:57:23
application/vnd.api+jsonПохоже, что он специально для apis, использующего json: api , очень узкую спецификацию с ее собственными ожиданиями и форматом, я не понимаю, что это для любого API, который возвращает json. Пожалуйста, поправьте меня, если я ошибаюсь
Hilikus 25.07.2016 22:49:12

Форматы JSON (JavaScript Object Notation) и JSONP («JSON with padding») кажутся очень похожими, и поэтому может быть очень запутанным, какой тип MIME они должны использовать. Хотя форматы похожи, между ними есть некоторые тонкие различия.

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

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

application/json.

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

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

27
13.03.2019 06:03:27

Если вы получаете данные из 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
39
21.04.2016 08:44:40

Чтобы указать интересный результат JSON, вы добавляете «application / json» в заголовок вашего запроса, как показано ниже:

«Accept: application / json» - это желаемый формат ответа.

«Content-Type: application / json» указывает формат содержимого вашего запроса, но иногда вы указываете и то, application/jsonи другое application/xml, но качество их может отличаться. Какой сервер отправит обратно разные форматы ответов, посмотрите на пример:

Accept:application/json;q=0.4,application/xml;q=8

Это вернет XML, потому что XML имеет более высокое качество.

7
13.03.2017 18:14:13
Если я могу начать аргумент здесь: заголовок accept в запросе не заставляет сервер отвечать в этом формате. Как вы сказали, это желаемый формат. Квалификатор q - это победа. Серверное приложение может идти вперед и отвечать в любом формате по своему усмотрению, если оно не соответствует заявленному запросу. В том же духе, если серверное приложение поддерживает только xml, указание json не будет выполнять автоматическое преобразование; Вы получите ответ XML.
Hussain Akbar 29.11.2019 05:26:52