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.
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.
-
dlaczego nie powinieneś używać
text/html
dla JSON -
Internet Explorer czasami ma problemy z
application/json
(nie żyje 2018-06-26) - dość kompletna lista typów MIME i do czego ich używać
- oficjalna lista typów mime w IANA z odpowiedzi @ gnrfan poniżej
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:
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
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);
}
};
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
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
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.
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
.
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/json
jest 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 .
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".
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.
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!
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
.
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
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 zanimapplication/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 przedapplication/json
został oficjalnie zarejestrowany.
W sumie, gdy masz jakiekolwiek wątpliwości co do typów treści, należy sprawdzić ten link
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.
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())
}
}
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
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
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),
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");
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 .
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"));
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.
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.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...
?>
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 .
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
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).
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.
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