Jaki jest prawidłowy typ zawartości JSON?

Bawię się z JSONEM od jakiegoś czasu, po prostu wypychając go jako tekst i nie zaszkodził nikomu (o czym wiem), ale chciałbym zacząć robić rzeczy prawidłowo.

Widziałem więc wiele rzekomych "standardów" dla typu zawartości JSON:

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

Ale która jest poprawna, czy najlepsza? Zakładam, że istnieją problemy z bezpieczeństwem i obsługą przeglądarki różniące się między nimi.

Wiem, że jest podobne pytanie, jaki typ MIME jeśli JSON jest zwracane przez REST API?, ale potrzebuję bardziej ukierunkowanej odpowiedzi.

Author: Community, 2009-01-25

30 answers

Dla JSON text:

application/json

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

For JSONP (runnable javascript) with callback:

application/javascript

Oto kilka wpisów na blogu, które zostały wymienione w komentarzach, które są istotne.

 9288
Author: Gumbo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-01 05:13:59

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

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

Więcej zasobów:

 1490
Author: gnrfan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-17 20:53:54

Dla JSON:

Content-Type: application/json

Dla JSON-P:

Content-Type: application/javascript
 797
Author: Alix Axel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-27 02:35:38

Oczywiście prawidłowym typem nośnika MIME dla JSON jest application/json, ale konieczne jest uświadomienie sobie, jakiego typu danych oczekuje się w Twojej aplikacji.

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

Client side, ext GWT form listener

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 application/json, przeglądarka sugeruje mi zapisanie pliku.

fragment kodu źródłowego po stronie serwera używanie 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);
    }
};
 592
Author: Mikhail.Mamaev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-04 22:37:14

JSON:

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

Przykład:

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

Content-Type: application/json


JSON-P:

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

Przykład:

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

Content-Type: application/javascript

 433
Author: Bhavin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-01 13:09:43

Jeśli używasz Ubuntu lub Debiana i służysz .pliki json poprzez Apache, możesz chcieć podawać pliki z prawidłowym typem zawartości. Robię to przede wszystkim dlatego, że chcę używać rozszerzenia Firefox JSONView

Moduł Apache mod_mime pomoże w tym łatwo. Jednak w Ubuntu musisz edytować plik / etc / mime.typy i dodaj wiersz

application/json json

Następnie uruchom ponownie Apache:

sudo service apache2 restart
 375
Author: Gourneau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-30 16:56:26

Jeśli dzwonisz ASP.NET Web Services od strony klienta musisz użyć application/json aby to działało. Wydaje mi się, że to samo dotyczy frameworków jQuery i Ext.

 364
Author: markvpc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-27 02:38:18

Właściwym typem zawartości dla JSON jest application/json, chyba że używasz JSONP, znanego również jako JSON z wypełnieniem, który w rzeczywistości jest JavaScript, a więc właściwym typem zawartości będzie application/javascript.

 289
Author: Resist Design,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-27 02:39:25

Nie ma wątpliwości, że application/jsonjest najlepszym typem MIME dla odpowiedzi JSON.

Ale miałem pewne doświadczenie, gdzie musiałem używać application/x-javascript z powodu pewnych problemów z kompresją. Moje środowisko hostingowe to hosting współdzielony z GoDaddy. Nie pozwalają mi na zmianę konfiguracji serwera. Dodałem następujący kod do pliku web.config 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"/>

Używając tego,strony aspx zostały skompresowane za pomocą G-zip, ale odpowiedzi JSON nie były. I Dodano

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

W sekcjach typy statyczne i dynamiczne. Ale to w ogóle nie kompresuje odpowiedzi JSON.

Po tym usunąłem ten nowo dodany typ i dodałem

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

W sekcjach typów statycznych i dynamicznych oraz zmieniono Typ odpowiedzi w

.ashx (asynchronous handler) do

application/x-javascript

I teraz odkryłem, że moje odpowiedzi JSON zostały skompresowane za pomocą G-zip. Dlatego osobiście polecam użycie

application/x-javascript

Only if you want to skompresuj odpowiedzi JSON na współdzielonym środowisku hostingu . Ponieważ w hostingu współdzielonym nie pozwalają na zmianę konfiguracji IIS .

 279
Author: shashwat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-09 08:31:59

Tylko w przypadku używania application/json jako typu MIME Mam następujący (od listopada 2011 w najnowszych wersjach Chrome, Firefox z Firebug):

  • koniec z ostrzeżeniami Chrome, gdy JSON jest ładowany z serwera.
  • Firebug doda zakładkę do odpowiedzi pokazującą dane JSON sformatowane. Jeśli typ MIME jest inny, pojawi się jako "Treść odpowiedzi".
 254
Author: Ivo Limmen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-25 15:52:33

Nie wszystko działa dla typu content application/json.

Jeśli używasz Ext JS formularz Wyślij do przesłania pliku, należy pamiętać, że odpowiedź serwera jest parsowana przez przeglądarkę, aby utworzyć dokument dla <iframe>.

Jeśli serwer używa JSON do wysyłania zwracanego obiektu, to nagłówek Content-Type musi być ustawiony na text/html, aby nakazać przeglądarce wstawienie niezmienionego tekstu do treści dokumentu.

Zobacz dokumentację Ext JS 3.4.0 API.

 231
Author: Conan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-02 15:53:02

JSON jest językiem specyficznym dla domeny (DSL) i formatem danych niezależnym od JavaScript i jako taki ma swój własny typ MIME , application/json. Szacunek dla typów MIME jest oczywiście zależny od klienta, więc text/plain może to zrobić dla transferu bajtów, ale wtedy niepotrzebnie naciskałbyś na interpretację do domeny aplikacji dostawcy - application/json. Czy można przenieść XML przez text/plain?

Ale szczerze mówiąc, twój wybór typu MIME jest poradą dla klienta, jak zinterpretować dane - text/plain or text/HTML (gdy nie jest to HTML) jest jak type erasure - jest tak samo nieinformatywne, jak tworzenie wszystkich obiektów typu Object w języku typowanym.

Żadne środowisko uruchomieniowe przeglądarki, które znam, nie pobierze dokumentu JSON i automatycznie udostępni go runtime jako obiekt JavaScript dostępny bez interwencji, ale jeśli pracujesz z kalekim klientem, to zupełnie inna sprawa. Ale to nie jest cała historia- RESTful usługi JSON często nie mają JavaScript runtimes, ale to nie przeszkadza im używać JSON jako realnego formatu wymiany danych. Jeśli klienci są tak kalekami... następnie rozważyłbym może zastrzyk HTML za pomocą usługi szablonów Ajax .

Application / JSON!

 215
Author: VLostBoy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-11 16:48:17

Jeśli jesteś w środowisku po stronie klienta, badanie dotyczące obsługi między przeglądarkami jest obowiązkowe dla dobrze obsługiwanej aplikacji internetowej.

Właściwym typem zawartości HTTP będzie application/json, jak już inni podkreślali, ale niektórzy klienci nie radzą sobie z tym zbyt dobrze, dlatego jQuery zaleca domyślne text/html.

 199
Author: Emanuele Del Grande,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-23 15:37:55

Prawidłowa odpowiedź brzmi:

Content-Type: application/json
 157
Author: Irfan DANISH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-22 11:11:31

Jak wielu innych wspomniało, application/json jest poprawną odpowiedzią.

Ale to, co jeszcze nie zostało wyjaśnione, to to, co oznaczają inne opcje, które zaproponowałeś.

  • application/x-javascript: eksperymentalny typ MIME dla JavaScript zanim application/javascript stał się standardem.

  • text/javascript: teraz przestarzałe. Powinieneś używać application/javascript Podczas korzystania z javascript.

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

  • text/x-json: eksperymentalny typ MIME dla JSON przed application/json został oficjalnie zarejestrowany.

W sumie, gdy masz jakiekolwiek wątpliwości co do typów treści, należy sprawdzić ten link

 154
Author: fcm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-17 20:05:26

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

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

Poprawnym typem nośnika MIME dla JSON jest application/json. JSP użyje go do wysłania odpowiedzi do klienta.

 138
Author: raja,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-05 07:08:05

"application/json" jest prawidłowym typem zawartoś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())
  }
}
 106
Author: Sukane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-25 17:59:57

IANA rejestracja dla application/json mówi

Aplikacje używające tego typu nośników: JSON został użyty do wymiany danych pomiędzy aplikacjami napisanymi we wszystkich tych języki 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 mediów typy , w rzeczywistości nawet application/javascript jest już przestarzałe. Więc {[2] } jest naprawdę jedyną możliwą poprawną odpowiedzią.

Obsługa przeglądarki to inna sprawa.

Najczęściej obsługiwane niestandardowe typy nośników to text/json lub text/javascript. Ale niektóre wielkie nazwiska używają nawet text/plain.

Jeszcze bardziej Dziwny jest nagłówek Content-Type wysłany przez Flickr, który zwraca JSON jako text/xml. Google używa text/javascript dla niektórych z interfejsów API ajax.

Przykłady:

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

Wyjście: Content-Type: text/javascript

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

Wyjście: Content-Type: text/xml

 96
Author: Lucky Kleinschmidt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-12 15:49:49

Odpowiedni typ MIME to application/json

Ale

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

text/html

application/javascript
 81
Author: LombaX,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-25 17:59:47

Używam poniższego

contentType: 'application/json',
data: JSON.stringify(SendData),
 69
Author: Andro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-17 09:52:13

Nagłówek Content-Type powinien być ustawiony na " application/json " podczas publikowania. Serwer nasłuchujący żądania powinien zawierać " Accept = application / json". W Spring MVC można to zrobić tak:

@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");
 61
Author: Alexander Burakevych,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-09 10:49:18

W Spring masz zdefiniowany typ: MediaType.APPLICATION_JSON_VALUE, który jest odpowiednikiemapplication/json .

 54
Author: Chand Priyankara,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-10 22:17:11

The application/json działa świetnie w PHP do przechowywania tablicy lub obiektu data.

Używam tego kodu do umieszczania danych w JSON na Google Cloud Storage (GCS) który jest ustawiony :

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

Aby odzyskać dane jest prosto do przodu:

$data = json_decode(file_get_contents("gs://BUCKETNAME/FILENAME.json"));
 52
Author: Chetabahana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-17 02:33:44

Jeśli JSON jest z wypełnieniem, to będzie to application/jsonp. Jeśli JSON jest bez wypełnienia, to będzie to application/json.

Aby poradzić sobie z obydwoma, dobrą praktyką jest używanie: 'application/javascript' bez zawracania sobie głowy, czy to z paddingiem, czy bez paddingu.

 46
Author: Ankit Zalani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-10 22:16:37

Do JSON używam:

 Content-Type: application/json
Jest to opisane we wniosku IETF w formacie JSON Data Interchange Format 7158, sekcja 1.2: specyfikacje JSON.
 46
Author: Mehmet_,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-02 04:03:22

Programiści PHP używają tego:

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

    // Do something here...
?>
 39
Author: Peter Mortensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-19 21:49:42

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

Istniejesilny argument o używaniu application/x-resource+json i application/x-collection+json, gdy reprezentujesz zasoby REST i zbiory.

I jeśli zdecydujesz się przestrzegać specyfikacji jsonapi , powinieneś używać application/vnd.api+json, Jak to jest udokumentowane.

Chociaż nie ma uniwersalnego standardu, jasne jest, że dodany semantyczny do przenoszonych zasobów uzasadnia bardziej explicit Content-Type niż tylko application/json.

Zgodnie z tym rozumowaniem inne konteksty mogłyby uzasadnić bardziej konkretny typ treści .

 39
Author: jgomo3,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-27 00:57:23

Jeśli otrzymujesz dane z REST API w JSON więc musisz użyć content-type

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
Author: Krishna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-21 08:44:40

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 powinni używać. Chociaż formaty wydają się być bardzo podobne, istnieją między nimi pewne subtelne różnice.

Więc w przypadku jakichkolwiek wątpliwości, mam bardzo proste podejście (które działa doskonale znaleźć w większości przypadków), a mianowicie, iść i sprawdzić odpowiedni RFC dokument.

JSON RFC 4627 (Typ aplikacji / nośnika json dla JavaScript Object Notation (JSON)) jest specyfikacją formatu JSON. W sekcji 6 jest napisane, że typ nośnika MIME dla tekstu JSON to

application/json.

JSONP JSONP ("JSON z wypełnieniem") jest obsługiwany w inny sposób niż JSON, w przeglądarce. JSONP jest traktowany jako zwykły skrypt JavaScript i dlatego powinien używać application/javascript, bieżącego oficjalnego typu MIME dla JavaScript. W wielu przypadkach jednak, text/javascript typ MIME też będzie działał dobrze.

Zauważ, że text/javascript został oznaczony jako przestarzały w dokumencie RFC 4329 (Skryptowe typy nośników) i zaleca się użycie application/javascript type. Jednak ze względu na starsze wersje, text/javascript jest nadal szeroko stosowany i ma obsługę między przeglądarkami (co nie zawsze ma miejsce w przypadku typu MIME application/javascript, szczególnie w starszych przeglądarkach).

 23
Author: Iresha Rubasinghe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-15 03:20:43

Content-type: application/json - json
Content-Type: application/javascript - json-P
Content-type: application/x-javascript - javascript
Content-type: text/javascript - javascript, ale przestarzały, starsze wersje IE używane jako atrybut html.
Content-type: text/x-javascript - typy multimediów JavaScript, ale przestarzałe
Content-type: text/x-json - json przed zgłoszeniem / json został oficjalnie zarejestrowany.

 16
Author: Kashif Solangi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-16 00:12:50