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

64 голосов
/ 09 августа 2013

Заголовок 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");
57 голосов
/ 01 апреля 2015

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"));
57 голосов
/ 29 июня 2013

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

49 голосов
/ 06 февраля 2015

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

 Content-Type: application/json

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

49 голосов
/ 21 июня 2013

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

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

42 голосов
/ 09 июня 2015

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

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

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

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

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

41 голосов
/ 29 марта 2014

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

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

    // Do something here...
?>
38 голосов
/ 11 апреля 2016

Если вы получаете данные из 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
24 голосов
/ 15 февраля 2016

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

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

1010 * 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/javascript MIME-тип также будет работать нормально.

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

23 голосов
/ 08 августа 2017

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 НО устарели
Content-Type: text/x-json - json до того, как приложение / json было официально зарегистрировано.

...