Який правильний тип вмісту JSON?


10250

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

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

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

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

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

Відповіді:


10306

Для тексту JSON:

application/json

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

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

application/javascript

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



Чи можу я надіслати файл Json разом?
OPV

7
У Internet Explorer іноді виникають проблеми із застосунком / json - блог в автономному режимі
kudlatiger

6
Уявіть, у мене є документ, написаний кимось, який містить звичайний текст. Тепер цей звичайний текст також є дійсним JSON. Чи не помиляюсь я тоді, щоб використовувати текст / просту як мім-тип? JSON - ПІД ТИП тексту. Тож я думаю, що обом слід дозволити. Питання в тому, що краще працює на практиці. За коментарем codetoshare IE має проблеми з застосуванням / json. Але жоден веб-переглядач не повинен мати проблем із текстом / простою. Якщо текст / звичайний текст небезпечний, то як я можу подавати текстові файли зі свого веб-сайту?
Panu Logic

5
@EugenMihailescu Назва цієї сторінки - "Неповний список типів MIME"
Omegastick

1616

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

На запитання про те, чому ні text/json, Крокфорд, схоже, сказав, що JSON - це насправді не JavaScript чи текст, а також IANA, швидше за все, роздавав, application/*ніж text/*.

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


166
Дуже багато речей було поміщено в text/*секцію в перші дні, які, ймовірно, будуть розміщені в application/*розділі в наші дні.
TRiG

29
@Rohmer - Ви можете "відкрити" що-небудь у текстовому редакторі, але двійковий формат, наприклад JPEG або Windows .exe або .zip, містить символи, що не можна друкувати, які насправді можуть зламати багато текстових редакторів або спричинити небажану поведінку. Спробуйте запустити, cat file.jpgнаприклад. Тоді як будь-який XML або json файл може бути 100% для друку. Тож я вважаю, що точка Штійна де Вітта є достовірною, незважаючи на те, що так, зараз уже пізно змінити.
XP84

4
@ XP84 Ви можете відкрити будь-який двійковий файл за допомогою текстового редактора у формі HEX. І всі різні символи (16 з них) на 100% для друку. Отже, за цією логікою ... чи всі тексти двійкових файлів? Json - це не текст. Json є (попередження: неформальне вільне визначення вперед) текстове зображення об'єкта (або масиву об'єктів)
xDaizu

5
Немає значення для фрази "текстовий редактор у формі HEX". Шестнадцятковий редактор показує кожен байт як його шістнадцяткове значення, наприклад, байт 1111000 як "78". Хоча можуть бути деякі текстові редактори, які також мають шестигранний режим редагування, це не є звичайним і корисним ні для чого, крім більшості технічних користувачів, які виконують найбільш технічні завдання. Текст, для порівняння, означає ASCII або Unicode, а в тексті байт 1111000 означає малі xсимволи. Не 78. JSON - це текст точно так само, як і HTML (text / html). Він містить лише читабельні текстові символи із структурованим значенням.
XP84

11
Я схильний погоджуватися зі Стином де Віттом. JSON призначений для перегляду та редагування текстовим редактором.
Panu Logic


632

Звичайно, правильний тип носія MIME для JSON є application/json, але необхідно усвідомити, який тип даних очікується у вашій програмі.

Наприклад, я використовую Ext GWT, і відповідь сервера повинна відповідати тексту / html, але містить дані JSON.

Сторона клієнта, слухач форми Ext GWT

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);
    }
};

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


46
Визначення JSON неправильне. Це не потрібно динамічно генерувати або дотримуватися параметрів запиту. Ви можете подавати статичний файл JSON. Також відповідь, яка найбільше схвалює, має посилання на RFC.
стиле

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 від клієнта, ви повинні використовувати application/jsonйого для роботи. Я вважаю, що це те саме для фреймворків jQuery та Ext .


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.


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 .


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 JS 3.4.0 .


40
Інструменти, які не відповідають стандартам, слід уникати, коли це можливо; використання application/jsonза специфікою.
one.beat.consumer

15
@ one.beat.consumer, хоча це правда, вона не характерна для ExtJs як такої. Це обмеження веб-переглядача (а точніше, можливо, "міра безпеки").
Хенді Іраван

7
Звичайно, було б краще використовувати текст / звичайний текст, щоб він не застосовував HTML-семантику до вмісту, що не містить HTML? Або браузери не дозволяють вам витягувати вміст кадру, якщо в ньому немає DOM?
Синхро

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, і як такий має свій власний 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!


210

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

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



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
@Oli ви можете сміливо відмовитися 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())
  }
}

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

10
Приклад такої ситуації?
Марк Амері

75

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

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

66

Під час публікації заголовка типу вмісту слід встановити значення " application / json ". Прослуховування сервера для запиту повинно містити " Accept = application / json ". Навесні MVC ви можете це зробити так:

@RequestMapping(value="location", method = RequestMethod.POST, headers = "Accept=application/json")

Додайте заголовки до відповіді:

HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");


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"));

50

Якщо JSON з підкладкою, то так і буде application/jsonp. Якщо JSON буде без прокладки, то так і буде application/json.

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


8
Перша частина вашої відповіді неправильна. "application / jsonp" не є дійсним типом MIME. Органом відповіді JSONP є лише JavaScript, тому один з типів MIME для JavaScript повинен використовуватися.
Роб Ш


43

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

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

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

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

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


3
application/vnd.api+jsonЗдається, спеціально для apis, що використовує json: api , дуже вузька специфікація зі своїми очікуваннями та форматом, я не розумію, що це стосується будь-якого API, який повертає json. Будь ласка, виправте мене, якщо я помиляюся
Хілікус


39

Якщо ви отримуєте дані від API REST в 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, АЛЕ застарілі
Content-Type: text/x-json- json до того, як заявка / json була офіційно зареєстрована.


Для тексту JSON: application / json Content-Type: application / json
Vikash Chauhan

28

Формати JSON (JavaScript Object Notation) та JSONP ("JSON з накладкою") виглядають дуже схожими, тому може бути дуже заплутаним, який тип MIME вони повинні використовувати. Незважаючи на те, що формати схожі, між ними є деякі тонкі відмінності.

Тому колись у будь-яких сумнівах у мене дуже простий підхід (який у більшості випадків прекрасно працює), а саме: перейти та перевірити відповідний документ RFC.

JSON RFC 4627 (Тип носія / json Media Type for JavaScript Object Notation (JSON)) - це специфікація формату JSON. У розділі 6 сказано, що тип носія MIME для тексту JSON є

application/json.

JSONP JSONP ("JSON з прокладкою") обробляється в браузері іншим способом, ніж JSON. JSONP трактується як звичайний сценарій JavaScript, і тому він повинен використовувати application/javascript,поточний офіційний тип MIME для JavaScript. Однак у багатьох випадках text/javascriptтип MIME також буде добре працювати.

Зверніть увагу, що документ RFC 4329 (Scripting Media Types) text/javascriptпозначений як застарілий, і рекомендується замість нього використовувати тип. Однак, через застарілі причини, він все ще широко використовується, і він має підтримку між браузерами (що не завжди буває з типом MIME, особливо з більш старими браузерами).application/javascripttext/javascriptapplication/javascript

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.