Які правільны тып кантэнту 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 09: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 05: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 у 01:19 2012-05-15 01: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 у 09:29 2012/12/31 09: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 у 08:43 2014/03/29 08: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 00: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 у 06:20 2016/02/15 06: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

Іншыя пытанні па пазнаках або Задайце пытанне