Який правильний тип контенту JSON?

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

Я бачив так багато передбачуваних "стандартів" для типу контенту JSON:

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

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

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

9470
25 янв. заданий Oli 25 Січня. 2009-01-25 18:25 '09 о 18:25 2009-01-25 18:25
@ 38 відповідей
  • 1
  • 2

Для тексту JSON:

application/json

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

Для JSONP (виконуваний JavaScript) зі зворотним викликом:

application/javascript

Ось деякі повідомлення в блозі, які були згадані в коментарях, які мають відношення до справи.

9468
25 янв. відповідь дан Gumbo 25 Січня. 2009-01-25 18:27 '09 о 18:27 2009-01-25 18:27

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

Коли його запитали про те, чому не text/json , Крокфорд, схоже, сказав, що JSON насправді не JavaScript, а текст, а IANA швидше за все передасть application*" enabled="false"/> </dynamicTypes> <staticTypes> <add mimeType="text*" 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 .

282
18 апр. відповідь дан shashwat 18 Квітня. 2012-04-18 11:22 '12 о 11:22 2012-04-18 11:22

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

  • Більше ніяких попереджень від Chrome при завантаженні JSON з сервера.
  • Firebug додасть вкладку у відповідь, що показує вам дані JSON відформатована. Якщо тип MIME відрізняється, він буде відображатися як "Вміст відповіді".
257
30 нояб. відповідь дан Ivo Limmen 30 нояб. 2011-11-30 09:42 '11 о 9:42 2011-11-30 9:42

Не всі працює для типу контенту application/json .

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

Якщо сервер використовує JSON для відправки об'єкта, що повертається, то заголовок Content-Type повинен бути встановлений в text/html , щоб повідомити браузеру вставити текст без змін в тіло документа.

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

232
07 сент. відповідь дан Conan 07 сент. 2011-09-07 05:41 '11 в 5:41 2011-09-07 5:41

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!

217
15 мая '12 в 1:19 2012-05-15 01:19 відповідь дан VLostBoy 15 травня '12 в 1:19 2012-05-15 1:19

Якщо ви перебуваєте в середовищі на стороні клієнта, дослідження для підтримки крос-браузера є обов'язковим для добре підтримуваного веб-додатки.

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

201
27 апр. відповідь дан Emanuele Del Grande 27 Квітня. 2012-04-27 19:27 '12 о 19:27 2012-04-27 19:27

Правильну відповідь:

 Content-Type: application/json 
159
31 дек. відповідь дан Irfan DANISH 31 дек. 2012-12-31 09:29 '13 в 9:29 2012-12-31 9:29

Як і багато інших, 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 отримав офіційну реєстрацію.

В цілому, всякий раз, коли у вас виникають сумніви щодо типів контенту, ви повинні перевірити це посилання

156
02 апр. відповідь дан fcm 02 Квітня. 2013-04-02 14:10 '13 о 14:10 2013-04-02 14:10

У JSP ви можете використовувати це в директиві сторінки:

 <%@ page > 

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

139
19 янв. відповідь дан raja 19 Січня. 2013-01-19 11:22 '13 о 11:22 2013-01-19 11:22

" 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()) } } 
108
26 февр. відповідь дан Sukane 26 февр. 2013-02-26 14:55 '13 о 14:55 2013-02-26 14:55

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

Програми, що використовують цей тип носія: JSON використовувався для обміну даними між додатками, написаними на всіх цих мовах програмування: ActionScript, C, С #, Clojure, ColdFusion, Common Lisp, E, Er>

Ви помітите, що 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> 

Вихід: Content-Type: text/javascript

 curl -I "https://www.flickr.com/services/rest/?method=flickr.test.echo> 

Вихід: Content-Type: text/xml

98
12 февр. відповідь дан Jhawins 12 февр. 2014-02-12 19:12 '14 о 19:12 2014-02-12 19:12

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

АЛЕ

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

 text/html application/javascript 
83
03 мая '13 в 19:00 2013-05-03 19:00 відповідь дан LombaX 03 травня '13 о 19:00 2013-05-03 19:00

Я використовую нижче

 contentType: 'application/json', data: JSON.stringify(SendData), 
70
16 мая '13 в 15:43 2013-05-16 15:43 відповідь дан Andro 16 травня '13 о 15:43 2013-05-16 15:43

Тема заголовка 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"); 
62
09 авг. відповідь дан Alexander Burakevych 09 Серпня. 2013-08-09 13:49 '13 о 13:49 2013-08-09 13:49

В Spring у вас є певний тип: MediaType.APPLICATION_JSON_VALUE , який еквівалентний application / json.

55
29 июня '13 в 11:34 2013-06-29 11:34 відповідь дан Chand Priyankara 29 червня '13 о 11:34 2013-06-29 11:34

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")); 
55
01 апр. відповідь дан Chetabahana 01 Квітня. 2015-04-01 19:13 '15 о 19:13 2015-04-01 19:13

Для JSON я використовую:

  Content-Type: application/json 

Це описано в реченні IETF JSON Data Interchange Format 7158, Розділ 1.2: Специфікації JSON .

47
06 февр. відповідь дан Mehmet_ 06 февр. 2015-02-06 15:01 '15 о 15:01 2015-02-06 15:01

Якщо JSON із заповненням, то це буде application/jsonp . Якщо JSON не має доповнення, то це буде application/json .

Щоб впоратися з ними, рекомендується використовувати: "application / javascript", не турбуючись про те, чи є це з заповненням або без заповнення.

47
21 июня '13 в 18:22 2013-06-21 18:22 відповідь дан Ankit Zalani 21 червня '13 о 18:22 2013-06-21 18:22

Розширення прийнятих відповідей, коли ви використовуєте JSON в контексті REST ...

Існує сильний сильний аргумент про використання application/x-resource+json і application/x-collection+json , коли ви уявляєте ресурси і колекції REST.

І якщо ви вирішите слідувати специфікації jsonapi, ви повинні використовувати application/vnd.api+json , як це документовано.

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

Дотримуючись цих міркувань, інші контексти могли б виправдати більш конкретний Content-Type.

40
09 июня '15 в 22:12 2015-06-09 22:12 відповідь дан jgomo3 09 червня '15 о 22:12 2015-06-09 22:12

Розробники PHP використовують це:

 <?php header("Content-type: application/json"); // Do something here... ?> 
39
29 марта '14 в 8:43 2014-03-29 08:43 відповідь дан user3087089 29 березня '14 в 8:43 2014-03-29 8:43

Якщо ви отримуєте дані з 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 
37
11 апр. відповідь дан Krishna 11 Квітня. 2016-04-11 12:15 '16 о 12:15 2016-04-11 12:15

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, особливо в старих браузерах).

23
15 февр. відповідь дан Iresha Rubasinghe 15 февр. 2016-02-15 06:20 '16 о 6:20 2016-02-15 6:20

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.

22

Інші питання по мітках або Задайте питання