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

10257

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

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

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

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

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

Oli
источник

Ответы:

10311

Для текста JSON:

application/json

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

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

application/javascript

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

гумбо
источник
Могу ли я отправить файл вместе с текстом Json?
ОПВ
7
У Internet Explorer иногда
возникают
6
Представьте, что у меня есть документ, написанный кем-то, который содержит простой текст. Теперь этот простой текст также является допустимым JSON. Буду ли я тогда неправильно использовать text / plain в качестве mime-типа? JSON - это ПОДПИСЬ текста. Поэтому я думаю, что оба должны быть разрешены. Вопрос в том, что лучше работает на практике. Согласно комментарию codetoshare IE имеет проблемы с приложением / JSON. Но ни у одного браузера не должно быть проблем с текстом / текстом. Если text / plain небезопасен, то как я могу подавать текстовые файлы с моего веб-сайта?
Panu Logic
5
@EugenMihailescu Заголовок этой страницы «Неполный список типов MIME»
Omegastick
1617

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

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

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

gnrfan
источник
166
Многое было добавлено в text/*раздел в первые дни, которые, вероятно, будут добавлены в application/*раздел в эти дни.
TRiG
29
@Rohmer - вы можете «открыть» что угодно в текстовом редакторе, но двоичный формат, такой как JPEG или Windows .exe или .zip, будет содержать непечатаемые символы, которые могут фактически сломать многие текстовые редакторы или вызвать нежелательное поведение. Попробуйте запустить, cat file.jpgнапример. Принимая во внимание, что любой файл XML или JSON на 100% для печати. Поэтому я думаю, что точка зрения Стейн де Витта является верной, несмотря на то, что да, уже слишком поздно что-либо менять.
XP84
4
@ XP84 Вы можете открыть любой двоичный файл с помощью текстового редактора в форме HEX. И все разные символы (16 из них) на 100% для печати. Итак, по этой логике ... все текстовые файлы? Джсон не текст. Json - это (предупреждение: неформальное свободное определение впереди) текстовое представление объекта (или массива объектов)
xDaizu
5
Нет смысла в фразе "текстовый редактор в шестнадцатеричной форме". Шестнадцатеричный редактор показывает каждый байт как шестнадцатеричное значение, например, байт 1111000 как «78». Хотя могут существовать некоторые текстовые редакторы, которые также имеют режим редактирования в шестнадцатеричном формате, это не является ни обычным, ни полезным для кого-либо, кроме большинства технических пользователей, выполняющих большинство технических задач. Текст для сравнения означает ASCII или Unicode, а в тексте байт 1111000 означает символ нижнего регистра x. Не 78. JSON - это текст точно так же, как HTML (text / html). Он содержит только читаемые текстовые символы со структурированным значением в них.
XP84
11
Я склонен согласиться со Стейн де Витт. JSON предназначен для просмотра и редактирования в текстовом редакторе.
Panu Logic
891

Для JSON:

Content-Type: application/json

Для JSON-P :

Content-Type: application/javascript
Аликс Аксель
источник
62
JSONP на самом деле не JSON, это техника для передачи литерала объекта JavaScript
Бенджамин Грюнбаум
632

Конечно, правильный тип носителя 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);
    }
};
Mikhail.Mamaev
источник
7
ответ сервера должен быть в виде текста / HTML. Это верно и для варианта ExtJS.
gbegley
463

JSON:

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

Пример:

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

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


JSON-P:

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

Пример:

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

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

Bhavin
источник
46
Определение JSON неверно. Его не нужно динамически генерировать или соблюдать параметры запроса. Вы можете обслуживать статический файл JSON. Кроме того, самый голосующий ответ имеет ссылку на RFC.
Styfle
10
Также JSONP может быть данными json, назначенными для переменной.
Джимми Кейн
401

Если вы используете Ubuntu или Debian и обслуживаете файлы .json через Apache, вы можете использовать файлы с правильным типом содержимого. Я делаю это в первую очередь потому, что я хочу использовать расширение 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 Services со стороны клиента, вы должны использовать application/jsonего для работы. Я считаю, что это то же самое для фреймворков jQuery и Ext .

markvpc
источник
20
Кажется, что jQuery работает по крайней мере с «application / json» и «text / plain» ... Я не пробовал все остальные.
Натан,
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
307

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

Resist Design
источник
296

Нет сомнений, что 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
источник
11
«Так что я лично рекомендую использовать application / x-javascript», где этот ответ вводит в заблуждение. GoDaddy делает позволить сжатие application/json, я использовать его на мой виртуальный хостинг , и я бы не советовал использовать другой тип контента , чтобы включить сжатие в любом случае, это просто неправильно. Это можно сделать, но все равно будет неправильно. Использование разных типов контента для поддержки браузера - это одно, а использование разных типов контента для сжатия на стороне сервера - это другое.
269

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

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

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

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

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

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

Конан
источник
40
По возможности следует избегать использования инструментов, которые не соответствуют стандартам; использовать application/jsonпо спецификации.
one.beat.consumer
15
@ one.beat.consumer, хотя это так, но это не относится к ExtJ как таковым. Это ограничение браузера (точнее, возможно, «мера безопасности»).
Хенди Ираван
7
Конечно, было бы лучше использовать text / plain, чтобы он не применял семантику HTML к содержимому, отличному от HTML? Или браузеры не позволяют извлекать содержимое фрейма, если у него нет DOM?
Synchro
5
Для того, чтобы добавить еще большую путаницу: я просто отладки подобный случай на 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
226

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!

VLostBoy
источник
210

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

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

Эмануэле Дель Гранде
источник
170

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

Content-Type: application/json
Ирфан Даниш
источник
166

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

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

ТСМ
источник
15
Когда text/javascriptстал устаревшим? Я все еще заполняю HTML-документы <script type="text/javascript" ...тэгами.
Оли
7
Это не имеет никакого значения для браузеров, на самом деле. Это просто устарело для стандартов RFC: rfc-editor.org/rfc/rfc4329.txt
fcm
16
@ Оли вы можете смело бросать type="text/javascript"и просто делать <script>...</script>по крайней мере в соответствии с HTML5.
TCB13
149

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

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

Правильный MIME тип носителя для JSON является 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())
  }
}
Sukane
источник
112

Регистрации 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


источник
90

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

НО

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

text/html

application/javascript
LombaX
источник
10
Пример такой ситуации?
Марк Амери
75

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

contentType: 'application/json',
data: JSON.stringify(SendData),
Andro
источник
66

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");
Александр Буракевич
источник
59

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

Чанд Приянкара
источник
2
Это тоже Java EE :: javax.ws.rs.core.MediaType
Eddie B
59

В 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"));
Chetabahana
источник
50

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

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

Анкит Залани
источник
8
Первая часть вашего ответа неверна. «application / jsonp» не является допустимым типом MIME. Тело ответа JSONP - это просто JavaScript, поэтому необходимо использовать один из MIME-типов для JavaScript.
Роб W
43

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

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

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

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

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

jgomo3
источник
3
application/vnd.api+jsonПохоже, что это специально для apis, использующего json: api , очень узкую спецификацию с ее собственными ожиданиями и форматом, я не понимаю, что это для любого API, который возвращает json. Пожалуйста, поправьте меня, если я ошибаюсь
Хиликус
42

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

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

    // Do something here...
?>
Питер Мортенсен
источник
39

Если вы получаете данные из 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
Кришна
источник
28

Content-Type: application/json- json
Content-Type: application/javascript- json-P
Content-Type: application/x-javascript- javascript
Content-Type: text/javascript- javascript НО устаревшие, более старые версии IE, используемые для использования в качестве атрибута html.
Content-Type: text/x-javascript- JavaScript Media Types НО устарел
Content-Type: text/x-json- json до того, как приложение / json было официально зарегистрировано.

Кашиф Соланги
источник
Для текста в
Викаш Чаухан,
28

Форматы 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, особенно в старых браузерах).

Иреша Рубасингхе
источник