Каков правильный тип содержимого 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 ]

235 голосов
/ 07 сентября 2011

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

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

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

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

220 голосов
/ 15 мая 2012

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!

204 голосов
/ 27 апреля 2012

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

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

163 голосов
/ 31 декабря 2012

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

Content-Type: application/json
160 голосов
/ 02 апреля 2013

Как уже упоминали многие, 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.

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

142 голосов
/ 19 января 2013

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

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

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

110 голосов
/ 26 февраля 2013

«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())
  }
}
103 голосов
/ 12 февраля 2014

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

85 голосов
/ 03 мая 2013

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

НО

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

text/html

application/javascript
72 голосов
/ 16 мая 2013

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

contentType: 'application/json',
data: JSON.stringify(SendData),
...