Jaki jest prawidłowy typ zawartości JSON?

10249

Przez jakiś czas bawiłem się w JSON , wypychając go jako tekst i nikomu nie zaszkodzi (o czym wiem), ale chciałbym zacząć robić wszystko poprawnie.

Widziałem tak wiele rzekomych „standardów” dla typu zawartości JSON:

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

Ale który z nich jest poprawny, czy najlepszy? Rozumiem, że występują różne problemy związane z bezpieczeństwem i obsługą przeglądarki.

Wiem, że istnieje podobne pytanie, jaki typ MIME, jeśli JSON jest zwracany przez interfejs API REST? , ale chciałbym nieco bardziej ukierunkowaną odpowiedź.

Oli
źródło

Odpowiedzi:

10305

W przypadku tekstu JSON:

application/json

Typ nośnika MIME dla tekstu JSON to application/json. Domyślne kodowanie to UTF-8. (Źródło: RFC 4627 ).

W przypadku JSONP (runnable javascript) z wywołaniem zwrotnym:

application/javascript

Oto kilka postów na blogu, które zostały wymienione w odpowiednich komentarzach.

Gumbo
źródło
47
Pełna lista typów MIME
Eugen Mihailescu
Czy mogę wysłać plik Json razem?
OPV
7
Internet Explorer czasami ma problemy z aplikacją / json - blog jest offline
kudlatiger
6
Wyobraź sobie, że mam dokument napisany przez kogoś, który zawiera zwykły tekst. Teraz ten zwykły tekst jest również prawidłowym JSON. Czy w takim razie popełniłbym błąd, używając tekstu / zwykłego jako typu MIME? JSON jest podtypem tekstu. Myślę więc, że oba powinny być dozwolone. Pytanie brzmi, co działa lepiej w praktyce. Według komentarza codetoshare IE ma problemy z aplikacją / json. Ale żadna przeglądarka nie powinna mieć problemów z tekstem / zwykłym tekstem. Jeśli tekst / zwykły jest niebezpieczny, jak mogę udostępniać pliki tekstowe z mojej strony internetowej?
Panu Logic,
5
@EugenMihailescu Tytuł tej strony to „Niekompletna lista typów MIME”
Omegastick
1616

IANA zarejestrowała oficjalny typ MIME dla JSON as application/json.

Zapytany o to, dlaczego nie text/json, Crockford powiedział, że JSON nie jest tak naprawdę JavaScript ani tekstem, a także IANA była bardziej skłonna do rozdania application/*niż text/*.

Więcej zasobów:

gnrfan
źródło
166
Wiele rzeczy zostało umieszczonych w text/*sekcji na początku, które prawdopodobnie zostałyby umieszczone w application/*sekcji w tych dniach.
TRiG,
29
@Rohmer - Możesz „otworzyć” wszystko w edytorze tekstu, ale format binarny, taki jak JPEG lub .exe lub Windows .zip, będzie zawierał znaki niedrukowalne, które mogą uszkodzić wiele edytorów tekstu lub spowodować niepożądane zachowanie. Spróbuj uruchomić cat file.jpgna przykład. Natomiast każdy plik xml lub json można w 100% wydrukować. Myślę więc, że punkt Stijn de Witt jest słuszny, mimo że tak, jest już za późno na zmianę.
XP84
4
@ XP84 Możesz otworzyć dowolny plik binarny za pomocą edytora tekstu w formie HEX. Wszystkie znaki (16 z nich) można w 100% wydrukować. Więc według tej logiki ... czy wszystkie pliki binarne są tekstem? Json to nie tekst. JSON jest (uwaga: nieformalny luźne naprzód definicja) reprezentacja tekst obiektu (lub tablica obiektów)
xDaizu
5
Wyrażenie „edytor tekstu w formacie HEX” nie ma znaczenia. Edytor szesnastkowy pokazuje każdy bajt jako jego wartość szesnastkową, na przykład bajt 1111000 jako „78”. Chociaż mogą istnieć niektóre edytory tekstu, które również mają tryb edycji szesnastkowej, nie jest to ani powszechne, ani użyteczne dla niczego, ale dla najbardziej technicznych użytkowników wykonujących najbardziej techniczne zadania. Dla porównania tekst oznacza ASCII lub Unicode, a w tekście bajt 1111000 oznacza małe xlitery. Nie 78. JSON jest tekstem dokładnie w taki sam sposób jak HTML (text / html). Zawiera tylko czytelne znaki tekstowe z ustrukturyzowanym znaczeniem.
XP84
11
Zwykle zgadzam się ze Stijn de Witt. JSON ma być przeglądany i edytowany za pomocą edytora tekstu.
Panu Logic,
891

W przypadku JSON:

Content-Type: application/json

W przypadku JSON-P :

Content-Type: application/javascript
Alix Axel
źródło
62
JSONP nie jest tak naprawdę JSON, to technika przekazywania dosłownych obiektów JavaScript
Benjamin Gruenbaum
632

Oczywiście poprawnym typem nośnika MIME dla JSON jest application/json , ale należy zdać sobie sprawę, jakiego rodzaju danych oczekuje się w Twojej aplikacji.

Na przykład używam Ext GWT i odpowiedź serwera musi iść jako text / html, ale zawiera dane JSON.

Po stronie klienta, moduł nasłuchujący 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");
    }
});

W przypadku użycia typu odpowiedzi aplikacji / json przeglądarka sugeruje mi zapisanie pliku.

Fragment kodu źródłowego po stronie serwera przy użyciu 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);
    }
};
Michaił.Mamaev
źródło
7
odpowiedź serwera musi być podana jako text / html. Dotyczy to również wariantu ExtJS.
gbegley
463

JSON:

Odpowiedź to dane generowane dynamicznie, zgodnie z parametrami zapytania przekazanymi w adresie URL.

Przykład:

{ "Name": "Foo", "Id": 1234, "Rank": 7 }

Typ zawartości: application/json


JSON-P:

JSON z wyściółką. Odpowiedź to dane JSON, z zawiniętym wywołaniem funkcji.

Przykład:

functionCall({"Name": "Foo", "Id": 1234, "Rank": 7});

Typ zawartości: application/javascript

Bhavin
źródło
46
Definicja JSON jest nieprawidłowa. Nie musi być generowany dynamicznie ani respektować parametrów zapytania. Możesz podać statyczny plik JSON. Również najbardziej uprzywilejowana odpowiedź zawiera link do RFC.
styfle
10
Również JSONP może być danymi json przypisanymi do var.
Jimmy Kane
401

Jeśli używasz Ubuntu lub Debiana i serwujesz pliki .json za pośrednictwem Apache, możesz chcieć podawać pliki z poprawnym typem zawartości. Robię to przede wszystkim dlatego, że chcę korzystać z rozszerzenia Firefox JSONView

Moduł Apache mod_mime pomoże to zrobić łatwo. Jednak w Ubuntu musisz edytować plik /etc/mime.types i dodać linię

application/json json

Następnie uruchom ponownie Apache:

sudo service apache2 restart
Gourneau
źródło
44
zwykle wystarczy przeładowanie (szybsze niż restart). Pamiętaj też, że możesz teraz wykonać „przeładowanie usługi sudo apache2”.
noamtm
19
Ubuntu 12.04 ma to domyślnie
Prizoff
386

Jeśli dzwonisz do ASP.NET Web Services po stronie klienta, musisz użyć application/jsontej funkcji, aby działała. Wierzę, że to samo dotyczy frameworków jQuery i Ext .

markvpc
źródło
20
Wygląda na to, że jQuery współpracuje przynajmniej z „application / json” i „text / plain” ... Nie próbowałem jednak wszystkich innych.
Nathan
jQuery jest zdolny do pracy z 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

Właściwym typem zawartości dla JSON jest application/jsonJEŚLI używasz JSONP , znanego również jako JSON z Padding, który w rzeczywistości jest JavaScript, a więc właściwym typem treści byłby application/javascript.

Odporny na projektowanie
źródło
296

Nie ma wątpliwości, że application/jsonjest to najlepszy typ MIME dla odpowiedzi JSON.

Ale miałem pewne doświadczenie, z którego musiałem korzystać z application/x-javascriptpowodu problemów z kompresją. Moje środowisko hostingowe to hosting współdzielony z GoDaddy . Nie pozwalają mi zmieniać konfiguracji serwera. Do mojego web.configpliku dodałem następujący kod do kompresji odpowiedzi.

<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"/>

Dzięki temu strony .aspx zostały skompresowane za pomocą g-zip, ale odpowiedzi JSON nie. dodałem

<add mimeType="application/json" enabled="true"/>

w sekcjach typów statycznych i dynamicznych. Ale to wcale nie kompresuje odpowiedzi JSON.

Następnie usunąłem ten nowo dodany typ i dodałem

<add mimeType="application/x-javascript" enabled="true"/>

zarówno w sekcjach typów statycznych, jak i dynamicznych, i zmieniono typ odpowiedzi w

.ashx (program obsługi asynchronicznej) do

application/x-javascript

A teraz odkryłem, że moje odpowiedzi JSON zostały skompresowane za pomocą g-zip. Więc osobiście polecam używać

application/x-javascript

tylko jeśli chcesz skompresować swoje odpowiedzi JSON we współdzielonym środowisku hostingowym . Ponieważ w hostingu współdzielonym nie pozwalają one zmieniać konfiguracji IIS .

shashwat
źródło
11
„Więc osobiście polecam użyć application / x-javascript”, gdy ta odpowiedź staje się myląca. GoDaddy ma pozwolić na zgniatanieapplication/json , I wykorzystać go na moim dzielonego hostingu i nie będę sugerować przy użyciu innego typu zawartości włączyć kompresję w każdym razie, to jest po prostu błędne. Można to zrobić, ale nadal będzie źle. Używanie różnych typów treści do obsługi przeglądarki to jedno, a używanie różnych typów treści do kompresji po stronie serwera to inna sprawa.
269

Tylko przy użyciu application/jsonjako typu MIME mam następujące informacje (od listopada 2011 r. Z najnowszymi wersjami Chrome, Firefox z Firebug ):

  • Nigdy więcej ostrzeżeń z Chrome, gdy JSON jest ładowany z serwera.
  • Firebug doda do odpowiedzi zakładkę pokazującą sformatowane dane JSON. Jeśli typ MIME jest inny, pojawi się jako „Treść odpowiedzi”.
Ivo Limmen
źródło
244

Nie wszystko działa dla typu zawartości application/json .

Jeśli korzystasz z formularza przesyłania JS Ext do przesłania pliku, pamiętaj, że przeglądarka analizuje odpowiedź serwera, aby utworzyć dokument dla<iframe> .

Jeśli serwer używa JSON do wysłania obiektu zwracanego, Content-Typenagłówek musi być ustawiony natext/html , aby nakazać przeglądarce wstawienie tekstu bez zmian w treści dokumentu.

Zobacz dokumentację interfejsu API Ext JS 3.4.0 .

Conan
źródło
40
W miarę możliwości należy unikać narzędzi niezgodnych ze standardami; użyć application/jsonwedług specyfikacji.
one.beat.consumer
15
@ one.beat.consumer, chociaż jest to prawda, nie jest ona specyficzna dla ExtJ jako takich. Jest to ograniczenie przeglądarki (a raczej „środek bezpieczeństwa”).
Hendy Irawan
7
Z pewnością lepiej byłoby użyć tekstu / zwykłego, aby nie stosował semantyki HTML do treści innych niż HTML? Czy też przeglądarki nie pozwalają wyodrębnić zawartości ramki, jeśli nie ma ona DOM?
Synchro,
5
Aby dodać dalszych nieporozumień: Ja tylko debugowanie podobny przypadek na Samsung Galaxy Beam (Android 2.3) z domyślnej przeglądarki, a iframewydaje się ognia loadimprezy na application/javascript, application/x-javascript, text/javascript, text/plain, ale NIE wypalania go application/jsonani text/html. Na dzień dzisiejszy Android <= 2.3 stanowi około 50% udziału w rynku Androida.
jakub.g
226

JSON jest język dziedzinowy (DSL) oraz niezależne format danych JavaScriptu, i jako taki posiada własny MIME typu, application/json. Szacunek dla typów MIME jest oczywiście oparty na kliencie, podobnie text/plainmoże być w przypadku przesyłania bajtów, ale wtedy niepotrzebnie popychasz interpretację do domeny aplikacji dostawcy - application/json. Czy przesłałbyś XML przez text/plain?

Ale szczerze mówiąc, twój wybór typu MIME jest wskazówką dla klienta, jak interpretować dane - text/plainlub text/HTML(gdy nie jest HTML) jest jak usuwanie typu - jest tak nieinformacyjny, jak uczynienie wszystkich twoich obiektów typu Object w języku pisanym na maszynie.

Żadne środowisko uruchomieniowe przeglądarki, o którym wiem, nie pobierze dokumentu JSON i automatycznie udostępni go środowisku wykonawczemu jako obiekt dostępny w JavaScript bez interwencji, ale jeśli pracujesz z kalekim klientem, to zupełnie inna sprawa. Ale to nie jest cała historia - usługi RESTful JSON często nie mają środowiska wykonawczego JavaScript, ale nie powstrzymuje ich to przed użyciem JSON jako realnego formatu wymiany danych. Jeśli klienci są tak sparaliżowani ... rozważałbym może zastrzyk HTML za pośrednictwem usługi szablonów Ajax .

Aplikacja / JSON!

VLostBoy
źródło
210

Jeśli pracujesz w środowisku klienta, sprawdzenie dobrze obsługiwanej aplikacji internetowej jest obowiązkowe.

Właściwy typ treści HTTP byłby application/json, jak już inni podkreśleni, ale niektórzy klienci nie radzą sobie z tym dobrze, dlatego jQuery zaleca ustawienie domyślne text/html.

Emanuele Del Grande
źródło
170

Poprawna odpowiedź to:

Content-Type: application/json
Irfan DUŃSKI
źródło
166

Jak wielu innych wspomniało, application/jsonto poprawna odpowiedź.

Ale to, co jeszcze nie zostało wyjaśnione, oznacza inne proponowane opcje.

  • application/x-javascript: Eksperymentalny typ MIME dla JavaScript wcześniej application/javascriptstał się standardem.

  • text/javascript: Teraz nieaktualne. Powinieneś używać application/javascriptpodczas używania javascript.

  • text/x-javascript: Eksperymentalny typ MIME dla powyższej sytuacji.

  • text/x-json: Eksperymentalny typ MIME dla JSON przed application/jsonoficjalną rejestracją.

Podsumowując, za każdym razem, gdy masz jakiekolwiek wątpliwości dotyczące typów treści, powinieneś sprawdzić ten link

fcm
źródło
15
Kiedy text/javascriptstał się przestarzały? Wciąż wypełniam dokumenty HTML <script type="text/javascript" ...tagami.
Oli
7
To naprawdę nie ma znaczenia dla przeglądarek. Jest to po prostu przestarzałe dla standardów RFC: rfc-editor.org/rfc/rfc4329.txt
fcm
16
@Oli możesz bezpiecznie upuścić type="text/javascript"i zrobić <script>...</script>co najmniej zgodnie z HTML5.
TCB13
149

W JSP możesz użyć tego w dyrektywie strony:

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

Prawidłowy typ nośnika MIME dla JSON to application/json. JSP użyje go do wysłania odpowiedzi do klienta.

radża
źródło
115

application/json” Jest poprawnym typem treści 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())
  }
}
Sukane
źródło
112

Rejestracyjny IANAapplication/json mówi

Aplikacje korzystające z tego typu mediów: JSON służy do wymiany danych między aplikacjami napisanymi we wszystkich tych językach programowania: ActionScript, C, C #, Clojure, ColdFusion, Common Lisp, E, Erlang, Go, Java, JavaScript, Lua, Objective CAML, Perl, PHP, Python, Rebol, Ruby, Scala i Scheme.

Zauważysz, że IANA.org nie wymienia żadnego z tych innych rodzajów mediów , w rzeczywistości nawet application/javascriptjest już przestarzały. Tak application/jsonnaprawdę jest to jedyna możliwa poprawna odpowiedź.

Obsługa przeglądarki to inna sprawa.

Najczęściej obsługiwanymi niestandardowymi typami mediów są text/jsonlub text/javascript. Ale używają nawet niektórych wielkich nazwisk text/plain.

Jeszcze bardziej dziwny jest nagłówek Content-Type wysyłany przez Flickr, który zwraca JSON as text/xml. Google używatext/javascript dla niektórych swoich aps ajax.

Przykłady:

curl -I "https://ajax.googleapis.com/ajax/services/search/video?v=1.0&q=jsonexample"

Wynik: Content-Type: text/javascript

curl -I "https://www.flickr.com/services/rest/?method=flickr.test.echo&format=json&api_key=f82254c1491d894f1204d8408f645a93"

Wynik: Content-Type: text/xml


źródło
90

Właściwy typ MIME to application/json

ALE

Doświadczyłem wielu sytuacji, w których potrzebny był typ przeglądarki lub użytkownik frameworka:

text/html

application/javascript
LombaX
źródło
10
Przykład takiej sytuacji?
Mark Amery
75

Korzystam z poniższych

contentType: 'application/json',
data: JSON.stringify(SendData),
Andro
źródło
66

Content-Type nagłówek powinien być ustawiony na „ application / json ” podczas wysyłania. Serwer nasłuchujący żądania powinien zawierać „ Accept = application / json ”. W Spring MVC możesz to zrobić w następujący sposób:

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

Dodaj nagłówki do odpowiedzi:

HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
Aleksander Burakowicz
źródło
59

Na wiosnę masz zdefiniowany typ: MediaType.APPLICATION_JSON_VALUErównoważny aplikacji / json .

Chand Priyankara
źródło
2
To także Java EE :: javax.ws.rs.core.MediaType
Eddie B
59

Te application/jsonprace wielki w PHP do przechowywania tablicy lub obiektu danych.

Używam tego kodu do umieszczania danych w JSON w Google Cloud Storage (GCS), który jest ustawiony do publicznego wyświetlania :

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

Odzyskiwanie danych jest proste:

$data = json_decode(file_get_contents("gs://BUCKETNAME/FILENAME.json"));
Chetabahana
źródło
50

Jeśli JSON jest wyposażony w padding, to będzie application/jsonp. Jeśli JSON jest bez wypełnienia, będzie application/json.

Aby poradzić sobie z obiema kwestiami, dobrą praktyką jest używanie: „application / javascript” bez zawracania sobie głowy, czy jest to padding czy padding.

Ankit Zalani
źródło
8
Pierwsza część twojej odpowiedzi jest błędna. „application / jsonp” nie jest prawidłowym typem MIME. Ciałem odpowiedzi JSONP jest po prostu JavaScript, więc należy użyć jednego z typów MIME dla JavaScript.
Rob W
43

Rozszerzanie akceptowanych odpowiedzi, gdy używasz JSON w kontekście REST ...

Istnieje silny argument na temat używania application/x-resource+jsoni application/x-collection+jsonreprezentowania zasobów i kolekcji REST.

A jeśli zdecydujesz się postępować zgodnie ze specyfikacją jsonapi , powinieneś użyć application/vnd.api+json, tak jak jest to udokumentowane.

Chociaż nie ma uniwersalnego standardu, jasne jest, że dodany semantyczny do przenoszonych zasobów uzasadnia bardziej wyraźny typ zawartości niż tylko application/json.

Zgodnie z tym rozumowaniem inne konteksty mogą uzasadniać bardziej szczegółowy typ zawartości .

jgomo3
źródło
3
application/vnd.api+jsonwydaje się być specjalnie dla apis korzystających json: API , bardzo wąski specyfikację z własnymi oczekiwaniami i formatu, nie rozumiem, że jest to dla każdej API, która zwraca JSON. Popraw mnie, jeśli się mylę
Hilikus,
42

Programiści PHP używają tego:

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

    // Do something here...
?>
Peter Mortensen
źródło
39

Jeśli otrzymujesz dane z interfejsu API REST w JSON, musisz użyć typu zawartości

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
Kryszna
źródło
28

Content-Type: application/json- json
Content-Type: application/javascript- json-P
Content-Type: application/x-javascript- javascript
Content-Type: text/javascript- javascript ALE przestarzałe, starsze wersje IE używane jako atrybuty HTML.
Content-Type: text/x-javascript- Typy mediów JavaScript ALE przestarzałe
Content-Type: text/x-json- json przed oficjalną rejestracją aplikacji / json.

Kashif Solangi
źródło
Dla tekstu JSON: application / json Content-Type: application / json
Vikash Chauhan
28

Formaty JSON (JavaScript Object Notation) i JSONP („JSON with padding”) wydają się być bardzo podobne i dlatego może być bardzo mylące, jakiego typu MIME powinny używać. Mimo że formaty są podobne, istnieją między nimi pewne subtelne różnice.

Dlatego zawsze, gdy mam jakiekolwiek wątpliwości, mam bardzo proste podejście (które w większości przypadków działa idealnie), a mianowicie idź i sprawdź odpowiedni dokument RFC.

JSON RFC 4627 (Aplikacja / json Media Type for JavaScript Object Notation (JSON)) to specyfikacja formatu JSON. W sekcji 6 napisano, że typ nośnika MIME dla tekstu JSON to

application/json.

JSONP JSONP („JSON z paddingiem”) jest obsługiwany w przeglądarce inaczej niż JSON. JSONP jest traktowany jako zwykły skrypt JavaScript, dlatego powinien używać application/javascript,bieżącego oficjalnego typu MIME dla JavaScript. Jednak w wielu przypadkach text/javascripttyp MIME również będzie działał dobrze.

Zauważ, że text/javascriptzostał oznaczony jako przestarzały w dokumencie RFC 4329 (Scripting Media Types) i zaleca się użycie application/javascriptzamiast niego tekstu. Jednak ze względu na starsze wersje text/javascriptjest nadal szeroko stosowany i obsługuje wiele przeglądarek (co nie zawsze ma miejsce w przypadku application/javascripttypu MIME, szczególnie w starszych przeglądarkach).

Iresha Rubasinghe
źródło