Ik ben al een tijdje aan het rommelen met JSON, en duw het er gewoon uit als tekst en het heeft niemand pijn gedaan (voor zover ik weet), maar ik zou de dingen graag goed willen doen.
Ik heb zoveel vermeende “standaarden” gezien voor het JSON-inhoudstype:
application/json
application/x-javascript
text/javascript
text/x-javascript
text/x-json
Maar welke is juist of het beste? Ik begrijp dat er problemen zijn met beveiliging en browserondersteuning.
Ik weet dat er een vergelijkbare vraag is, Welk MIME-type als JSON wordt geretourneerd door een REST API?, maar ik zou graag een iets gerichter antwoord willen.
Antwoord 1, autoriteit 100%
Voor JSON-tekst:
application/json
Het MIME-mediatype voor JSON-tekst is
application/json
. De standaardcodering is UTF-8. (Bron: RFC 4627)
Voor JSONP(uitvoerbaar JavaScript) met callback:
application/javascript
Hier zijn enkele blogberichten die werden genoemd in de relevante opmerkingen:
- Waarom u
text/HTML
voor JSON - Internet Explorer heeft soms problemen met
application/json
- Een vrij complete lijst van Mimetypes en waarvoor ze moeten worden gebruikt
- De officiële lijst met mime-types bij IANAuit het antwoord van @gnrfan hieronder
Antwoord 2, autoriteit 16%
IANAheeft het officiële MIME-type voor JSON geregistreerd als application/json
.
Op de vraag waarom niet text/json
, lijkt Crockford te hebben gezegd dat JSON niet echt JavaScript of tekst is en dat IANA eerder application/*
uitdeelde dan text/*
.
Meer bronnen:
Antwoord 3, autoriteit 9%
Voor JSON:
Content-Type: application/json
Voor JSON-P:
Content-Type: application/javascript
Antwoord 4, autoriteit 6%
Natuurlijk is het juiste MIME-mediatype voor JSON application/json
, maar het is noodzakelijk om te beseffen welk type gegevens in uw toepassing wordt verwacht.
Ik gebruik bijvoorbeeld Ext GWTen de serverreactie moet gaan als text/htmlmaar bevat JSON-gegevens.
Klantzijde, Ext GWT vorm luisteraar
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");
}
});
In het geval van het gebruik van het antwoordtype application/json, stelt de browser me voor om het bestand op te slaan.
Snippet van de broncode aan de serverzijde met behulp van 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);
}
};
Antwoord 5, autoriteit 4%
JSON:
Reactie is dynamisch gegenereerde gegevens, volgens de queryparameters die in de URL zijn doorgegeven.
Voorbeeld:
{ "Name": "Foo", "Id": 1234, "Rank": 7 }
Inhoudstype:application/json
JSON-P:
JSON met opvulling.
Reactie is JSON-gegevens, met een functieaanroep eromheen.
Voorbeeld:
functionCall({"Name": "Foo", "Id": 1234, "Rank": 7});
Inhoudstype:application/javascript,
Antwoord 6, autoriteit 4%
Als u Ubuntu of Debian gebruikt en u .json-bestanden aanbiedt via Apache, wilt u wellicht de bestanden met het juiste inhoudstype aanbieden. Ik doe dit voornamelijk omdat ik de Firefox-extensie JSONView
wil gebruiken
De Apache-module mod_mimehelpt om dit gemakkelijk te doen. Met Ubuntu moet u echter het bestand /etc/mime.typesbewerken en de regel toevoegen
application/json json
Herstart Apache vervolgens:
sudo service apache2 restart
Antwoord 7, autoriteit 4%
Als je ASP.NET Web Services vanaf de client-kant belt, moet je application/json
gebruiken om het te laten werken. Ik geloof dat dit hetzelfde is voor de jQueryen Ext-frameworks.
Antwoord 8, autoriteit 3%
Het juiste inhoudstype voor JSON is application/json
TENZIJ u JSONPgebruikt , ook bekend als JSON met Padding, wat eigenlijk JavaScript is en daarom zou het juiste inhoudstype application/javascript,
zijn.
Antwoord 9, autoriteit 3%
Het lijdt geen twijfel dat application/json
de beste MIMEtyp voor een JSON-antwoord.
Maar ik had enige ervaring waarbij ik application/x-javascript
moest gebruiken vanwege compressieproblemen. Mijn hostingomgeving is shared hosting met GoDaddy. Ze staan me niet toe om serverconfiguraties te veranderen. Ik had de volgende code toegevoegd aan mijn web.config
-bestand om reacties te comprimeren.
<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"/>
Hierdoor werden de .aspx-pagina’s gecomprimeerd met g-zip, maar JSON-reacties niet. Ik heb toegevoegd
<add mimeType="application/json" enabled="true"/>
in de secties statische en dynamische typen. Maar dit comprimeert helemaal geen JSON-reacties.
Daarna heb ik dit nieuw toegevoegde type verwijderd en toegevoegd
<add mimeType="application/x-javascript" enabled="true"/>
in zowel de secties voor statische als dynamische typen, en veranderde het antwoordtype in
.ashx (asynchrone handler) naar
application/x-javascript
En nu ontdekte ik dat mijn JSON-reacties waren gecomprimeerd met g-zip. Dus ik raad persoonlijk aan om
application/x-javascript
alleen als u uw JSON-reacties wilt comprimeren op een gedeelde hostingomgeving. Omdat ze u bij shared hosting niet toestaan om IIS-configuraties te wijzigen.
Antwoord 10, autoriteit 3%
Alleen bij gebruik van application/json
als MIMEtype I hebben het volgende (vanaf november 2011 met de meest recente versies van Chrome, Firefox met Firebug):
- Geen waarschuwingen meer van Chrome wanneer de JSON van de server wordt geladen.
- Firebug voegt een tabblad toe aan het antwoord met de JSON-gegevens
geformatteerd. Als het MIME-type anders is, wordt het gewoon weergegeven als:
‘Reactieinhoud’.
Antwoord 11, autoriteit 2%
Niet alles werkt voor inhoudstype application/json
.
Als je een Ext JSformulier gebruikt om het bestand te uploaden, houd er dan rekening mee dat de server reactie wordt door de browser geparseerd om het document voor de <iframe>
te maken.
Als de server JSON gebruikt om het retourobject te verzenden, moet de Content-Type
-header worden ingesteld op text/HTML
om de browser te laten weten dat deze moet invoegen de tekst ongewijzigd in de hoofdtekst van het document.
Zie de Ext JS 3.4.0 API-documentatie.
Antwoord 12, autoriteit 2%
JSON is een domeinspecifieke taal(DSL) en een gegevensformaat dat onafhankelijk is van JavaScript, en als zodanig heeft zijn eigen MIME-type, application/json
. Respect voor MIME-typen is natuurlijk client-gedreven, dus text/plain
kan voldoende zijn voor de overdracht van bytes, maar dan zou je de interpretatie onnodig naar het applicatiedomein van de leverancier pushen – application/json
. Zou je XML overdragen via text/plain
?
Maar eerlijk gezegd, uw keuze voor het MIME-type is advies aan de klant over hoe de gegevens te interpreteren – text/plain
of text/HTML
(als het geen HTML is) ) lijkt op het wissen van typen – het is net zo weinig informatief als het maken van al uw objecten van het type Object in een getypte taal.
Geen enkele browserruntime die ik ken, zal een JSON-document gebruiken en het automatisch beschikbaar stellen aan de runtime als een JavaScript-toegankelijk object zonder tussenkomst, maar als je met een kreupele client werkt, is dat een heel andere zaak. Maar dat is niet het hele verhaal- RESTfulJSON-services hebben vaak geen JavaScript-runtimes, maar het stopt niet ze gebruiken JSON als een levensvatbaar formaat voor gegevensuitwisseling. Als klanten zo kreupel zijn… dan zou ik in plaats daarvan misschien HTML-injectie overwegen via een Ajax-sjabloonservice.
Applicatie/JSON!
Antwoord 13, autoriteit 2%
Als u zich in een clientomgeving bevindt, is onderzoek naar de ondersteuning voor meerdere browsers verplicht voor een goed ondersteunde webtoepassing.
Het juiste HTTP-inhoudstype zou application/json
zijn, zoals anderen ook al hebben benadrukt, maar sommige clients gaan er niet goed mee om, daarom beveelt jQuery de standaard text/html
.
Antwoord 14, autoriteit 2%
Het juiste antwoord is:
Content-Type: application/json
Antwoord 15, autoriteit 2%
Zoals vele anderen al hebben gezegd, is application/json
het juiste antwoord.
Maar wat nog niet is uitgelegd, is wat de andere opties die je hebt voorgesteld betekenen.
-
application/x-javascript
: experimenteel MIME-type voor JavaScript voordatapplication/javascript,
standaard werd gemaakt. -
text/javascript
: nu verouderd. U moetapplication/javascript,
gebruiken wanneer u javascript gebruikt. -
text/x-javascript
: Experimenteel MIME-type voor de bovenstaande situatie. -
text/x-json
: Experimenteel MIME-type voor JSON voordatapplication/json
officieel werd geregistreerd.
Al met al, als je twijfels hebt over inhoudstypes, moet je deze link
Antwoord 16
In JSPkunt u dit gebruiken in pagina-richtlijn:
<%@ page language="java" contentType="application/json; charset=UTF-8"
pageEncoding="UTF-8"%>
Het juiste MIME-mediatype voor JSON is application/json
. JSP zal het gebruiken om een reactie naar de klant te sturen.
Antwoord 17
application/json
is het juiste JSON-inhoudstype.
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())
}
}
Antwoord 18
De IANA-registratie voor application/json
zegt
Toepassingen die dit mediatype gebruiken: JSON is gebruikt om
gegevens uitwisselen tussen applicaties die in al deze zijn geschreven
programmeertalen: ActionScript, C, C#, Clojure, ColdFusion,
Gemeenschappelijke Lisp, E, Erlang, Go, Java, JavaScript, Lua, Objective CAML,
Perl, PHP, Python, Rebol, Ruby, Scala en Schema.
Je zult merken dat IANA.org geen van de deze andere mediatypen, in feite is zelfs application/javascript,
nu achterhaald. Dus application/json
is eigenlijk het enige mogelijke juisteantwoord.
Browserondersteuning is iets anders.
De meest ondersteunde niet-standaard mediatypen zijn text/json
of text/javascript
. Maar sommige grote namen gebruiken zelfs text/plain
.
Nog vreemder is de Content-Type header die wordt verzonden door Flickr, die JSON retourneert als text/xml
. Google gebruikt text/javascript
voor sommige van zijn ajax api’s.
Voorbeelden:
curl -I "https://ajax.googleapis.com/ajax/services/search/video?v=1.0&q=jsonexample"
Uitvoer: Content-Type: text/javascript
curl -I "https://www.flickr.com/services/rest/?method=flickr.test.echo&format=json&api_key=f82254c1491d894f1204d8408f645a93"
Uitvoer: Content-Type: text/xml
Antwoord 19
Het juiste MIME-type is application/json
MAAR
Ik heb veel situaties meegemaakt waarin het browsertype of de frameworkgebruiker het volgende nodig had:
text/html
application/javascript
Antwoord 20
Ik gebruik de onderstaande
contentType: 'application/json',
data: JSON.stringify(SendData),
Antwoord 21
De kop Content-Typemoet worden ingesteld op ‘application/json‘ bij het posten. De server die naar het verzoek luistert, moet “Accept=application/json” bevatten.
In Spring MVC kun je het als volgt doen:
@RequestMapping(value="location", method = RequestMethod.POST, headers = "Accept=application/json")
Voeg kopteksten toe aan het antwoord:
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
Antwoord 22
De
application/json
werkt prima in PHP om een array of object op te slaan
gegevens.
Ik gebruik deze code om gegevens in JSON op te slaan op Google Cloud Storage (GCS)die is ingesteld publiekelijk zichtbaar:
$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
);
Om de gegevens terug te krijgen is eenvoudig:
$data = json_decode(file_get_contents("gs://BUCKETNAME/FILENAME.json"));
Antwoord 23
In Springheb je een gedefinieerd type: MediaType.APPLICATION_JSON_VALUE
wat gelijk is aan application/json.
Antwoord 24
Voor JSON gebruik ik:
Content-Type: application/json
Dit wordt beschreven in het JSON Data Interchange Format 7158-voorstel van de IETF, Sectie 1.2: Specificaties van JSON.
Antwoord 25
Als de JSON met padding is, is dit application/jsonp
. Als de JSON geen opvulling heeft, is het application/json
.
Om met beide om te gaan, is het een goede gewoonte om ‘application/javascript’ te gebruiken zonder dat u zich zorgen hoeft te maken of het met opvulling of zonder opvulling is.
Antwoord 26
PHP-ontwikkelaars gebruiken dit:
<?php
header("Content-type: application/json");
// Do something here...
?>
Antwoord 27
Uitbreiding van de geaccepteerde antwoorden, wanneer u JSON gebruikt in een REST-context…
Er is een sterk argumentover het gebruik van de application/x-resource+json
en application/x-collection+json
wanneer u REST-bronnen en -verzamelingen vertegenwoordigt.
En als u besluit de jsonapi-specificatie te volgen, moet ugebruik maken van application/vnd.api+json
, zoals gedocumenteerd.
Hoewel er geen universele standaard is, is het duidelijk dat de toegevoegde semantiek aan de bronnen die worden overgedragen een explicieter Content-Typerechtvaardigt dan alleen application/json
.
Volgens deze redenering zouden andere contexten een specifieker Content-Typekunnen rechtvaardigen.
Antwoord 28
Als u gegevens van REST API in JSON krijgt, moet u content-type gebruiken
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
Antwoord 29
JSON(JavaScript Object Notation) en JSONP(“JSON met opvulling”)-indelingen lijken erg op elkaar en daarom kan het erg verwarrend zijn welk MIME-type ze moeten gebruiken. Hoewel de formaten vergelijkbaar zijn, zijn er enkele subtiele verschillen tussen hen.
Dus als ik twijfels heb, heb ik een heel eenvoudige aanpak (die in de meeste gevallen prima werkt), namelijk, ga en controleer het bijbehorende RFC-document.
JSON
RFC 4627(De applicatie/json Media Type voor JavaScript Object Notation (JSON)) is een specificaties van JSON-formaat. In sectie 6 staat dat het MIME-mediatype voor JSON-tekst
. is
application/json.
JSONP
JSONP (“JSON met opvulling”) wordt in een browser op een andere manier afgehandeld dan JSON. JSONP wordt behandeld als een gewoon JavaScript-script en daarom moet het application/javascript,
gebruiken, het huidige officiële MIME-type voor JavaScript. In veel gevallen zal het MIME-type text/javascript
echter ook goed werken.
Merk op dat text/javascript
is gemarkeerd als verouderd door RFC 4329(Scripting Media Types) document en het wordt aanbevolen om in plaats daarvan het type application/javascript,
te gebruiken. Vanwege verouderde redenen wordt text/javascript
echter nog steeds veel gebruikt en biedt het ondersteuning voor meerdere browsers (wat niet altijd het geval is met het MIME-type application/javascript,
, vooral met oudere browsers).
Antwoord 30
Content-Type: application/json
– json
Content-Type: application/javascript
– json-P
Content-Type: application/x-javascript
– javascript
Content-Type: text/javascript
– javascript MAAR verouderde, oudere IE-versies die gebruikt werden als html-attribuut.
Content-Type: text/x-javascript
– JavaScript-mediatypen MAAR verouderd
Content-Type: text/x-json
– json voordat applicatie/json officieel werd geregistreerd.