IT-Swarm.Net

Was ist der richtige JSON-Inhaltstyp?

Ich habe eine Weile mit JSON rumgespielt, es nur als Text rausgedrückt und es hat niemanden verletzt (von dem ich weiß), aber ich würde gerne anfangen, Dinge zu tun richtig.

Ich habe so viele angebliche "Standards" für den JSON-Inhaltstyp gesehen:

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

Aber welches ist richtig oder am besten? Ich stelle fest, dass es Sicherheits- und Browser-Supportprobleme gibt, die sich voneinander unterscheiden.

Ich weiß, dass es eine ähnliche Frage gibt: Welcher MIME-Typ, wenn JSON von einer REST-API zurückgegeben wird?, aber ich hätte gerne eine etwas gezieltere Antwort.

9828
Oli

Für JSON-Text:

application/json

Der MIME-Medientyp für JSON-Text ist application/json. Die Standardkodierung ist UTF-8. (Quelle: RFC 4627 ).

Für JSONP (lauffähiges Javascript) mit Rückruf:

application/javascript

Hier sind einige Blog-Beiträge, die in den relevanten Kommentaren erwähnt wurden.

9854
Gumbo

IANA hat den offiziellen MIME-Typ für JSON als application/json registriert.

Auf die Frage, warum nicht _text/json_, scheint Crockford gesagt zu haben, dass JSON nicht wirklich JavaScript oder Text ist und dass IANA eher _application/*_ als _text/*_ austeilt.

Mehr Ressourcen:

1574
gnrfan

Für JSON:

Content-Type: application/json

Für JSON-P :

Content-Type: application/javascript
849
Alix Axel

Natürlich ist der richtige MIME-Medientyp für JSON application/json, aber es muss klar sein, welcher Datentyp in Ihrer Anwendung erwartet wird.

Zum Beispiel verwende ich Ext GWT und die Serverantwort muss text/html lauten, enthält aber JSON-Daten.

Client-Seite, Ext GWT-Formular-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");
    }
});

Wenn Sie den Antworttyp application/json verwenden, empfiehlt mir der Browser, die Datei zu speichern.

Serverseitiges Quellcode-Snippet mit 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);
    }
};
619
Mikhail.Mamaev

JSON:

Die Antwort besteht aus dynamisch generierten Daten gemäß den in der URL übergebenen Abfrageparametern.

Beispiel:

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

Inhaltstyp:application/json


JSON-P:

JSON mit Polsterung. Die Antwort sind JSON-Daten, die von einem Funktionsaufruf umgeben sind.

Beispiel:

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

Inhaltstyp:application/javascript

457
Bhavin

Wenn Sie Ubuntu oder Debian verwenden und .json-Dateien über Apache bereitstellen, möchten Sie möglicherweise die Dateien mit dem richtigen Inhaltstyp bereitstellen. Ich mache das hauptsächlich, weil ich die Firefox-Erweiterung JSONView verwenden möchte

Das Apache-Modul mod_mime hilft Ihnen dabei. Unter Ubuntu müssen Sie jedoch die Datei /etc/mime.types bearbeiten und die Zeile hinzufügen

application/json json

Dann starte Apache neu:

Sudo service Apache2 restart
393
Gourneau

Wenn Sie die ASP.NET-Webdienste vom Client aus aufrufen, müssen Sie application/json verwenden, damit dies funktioniert. Ich glaube, dass dies auch für die Frameworks jQuery und Ext gilt.

378
markvpc

Der richtige Inhaltstyp für JSON ist application/json, AUSSER Sie verwenden JSONP , auch bekannt als JSON mit Padding, das eigentlich JavaScript ist. Der richtige Inhaltstyp wäre application/javascript.

301
Resist Design

Es besteht kein Zweifel, dass application/json der beste MIME Typ für eine JSON-Antwort ist.

Ich hatte jedoch einige Erfahrungen mit der Verwendung von application/x-javascript aufgrund von Komprimierungsproblemen. Meine Hosting-Umgebung ist Shared Hosting mit GoDaddy . Sie erlauben mir nicht, Serverkonfigurationen zu ändern. Ich habe meiner web.config -Datei den folgenden Code zum Komprimieren von Antworten hinzugefügt.

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

Auf diese Weise wurden die ASPX-Seiten mit g-Zip komprimiert, JSON-Antworten jedoch nicht. Ich fügte hinzu

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

in den Abschnitten statische und dynamische Typen. Dies komprimiert jedoch keine JSON-Antworten.

Danach habe ich diesen neu hinzugefügten Typ entfernt und hinzugefügt

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

in den Abschnitten für statische und dynamische Typen und änderte den Antworttyp in

.ashx (asynchroner Handler) zu

application/x-javascript

Und jetzt stellte ich fest, dass meine JSON-Antworten mit g-Zip komprimiert wurden. Daher empfehle ich persönlich die Verwendung

application/x-javascript

nur wenn Sie Ihre JSON-Antworten in einer gemeinsam genutzten Hosting-Umgebung komprimieren möchten . Weil sie Ihnen beim Shared Hosting nicht erlauben, IIS Konfigurationen zu ändern.

289
shashwat

Nur bei Verwendung von application/json als MIME Typ habe ich folgendes (ab November 2011 mit den neuesten Versionen von Chrome, Firefox mit Firebug ):

  • Keine weiteren Warnungen von Chrome, wenn der JSON vom Server geladen wird.
  • Firebug fügt der Antwort einen Tab hinzu, der die formatierten JSON-Daten anzeigt. Wenn der MIME-Typ unterschiedlich ist, wird er nur als "Antwortinhalt" angezeigt.
264
Ivo Limmen

Nicht alles funktioniert für den Inhaltstyp application/json.

Wenn Sie Ext JS form submit to upload file verwenden, beachten Sie, dass die Serverantwort vom Browser analysiert wird, um das Dokument für den <iframe> zu erstellen.

Wenn der Server JSON zum Senden des Rückgabeobjekts verwendet, muss der Header Content-Type auf text/html gesetzt werden, damit der Browser den Text unverändert in den Dokumenttextkörper einfügt.

Siehe die Ext JS 3.4.0 API-Dokumentation .

239
Conan

JSON ist eine domänenspezifische Sprache (DSL) und ein von JavaScript unabhängiges Datenformat und hat als solches einen eigenen MIME -Typ, application/json. Der Respekt für MIME-Typen ist natürlich mandantengesteuert, so dass text/plain möglicherweise für die Übertragung von Bytes gilt, aber Sie würden dann die Interpretation unnötigerweise in die Anwendungsdomäne des Anbieters verschieben - application/json. Würden Sie XML über text/plain übertragen?

Aber ehrlich gesagt, Ihre Wahl des MIME-Typs ist ein Ratschlag für den Kunden, wie die Daten zu interpretieren sind - text/plain oder text/HTML (wenn es sich nicht um HTML handelt) ist wie das Löschen von Typen - es ist so wenig aussagekräftig, als würden Sie alle Daten löschen Objekte vom Typ Objekt in einer typisierten Sprache.

Keine mir bekannte Browser-Laufzeit nimmt ein JSON-Dokument und stellt es der Laufzeit automatisch ohne Eingreifen als JavaScript-zugängliches Objekt zur Verfügung. Wenn Sie jedoch mit einem verkrüppelten Client arbeiten, ist dies eine ganz andere Angelegenheit. Aber das ist nicht die ganze Geschichte RESTful JSON-Services haben oft keine JavaScript-Laufzeiten, aber es hindert sie nicht daran, JSON als praktikables Datenaustauschformat zu verwenden. Wenn Clients so verkrüppelt sind ... dann würde ich vielleicht eine HTML-Injection über einen Ajax Template-Service in Betracht ziehen.

Anwendung/JSON!

223
VLostBoy

Wenn Sie sich in einer clientseitigen Umgebung befinden, müssen Sie sich über die Unterstützung für mehrere Browser informieren, damit eine gut unterstützte Webanwendung funktioniert.

Der richtige HTTP-Inhaltstyp wäre application/json, wie andere bereits hervorgehoben haben, aber einige Clients kommen damit nicht sehr gut zurecht. Deshalb empfiehlt jQuery den Standardwert text/html.

206

Die richtige Antwort ist:

Content-Type: application/json
165
Irfan DANISH

Wie viele andere bereits erwähnt haben, ist application/json die richtige Antwort.

Was jedoch noch nicht erklärt wurde, sind die anderen von Ihnen vorgeschlagenen Optionen.

  • application/x-javascript: Experimenteller MIME-Typ für JavaScript, bevor application/javascript zum Standard gemacht wurde.

  • text/javascript: Jetzt veraltet. Sie sollten application/javascript verwenden, wenn Sie Javascript verwenden.

  • text/x-javascript: Experimenteller MIME-Typ für die oben genannte Situation.

  • text/x-json: Experimenteller MIME-Typ für JSON, bevor application/json offiziell registriert wurde.

Alles in allem sollten Sie bei Zweifeln an den Inhaltstypen diesen Link aktivieren

163
fcm

In JSP können Sie dies in der page-Direktive verwenden:

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

Der korrekte Medientyp MIME für JSON ist application/json. JSP verwendet es zum Senden einer Antwort an den Client.

146
raja

"application/json" ist der richtige JSON-Inhaltstyp.

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
Sukane

In der IANA-Registrierung für application/json steht

Anwendungen, die diesen Medientyp verwenden: Mit JSON wurden Daten zwischen Anwendungen ausgetauscht, die in den folgenden Programmiersprachen geschrieben wurden: ActionScript, C, C #, Clojure, ColdFusion, Gemeinsames LISP, E, Erlang, Go, Java, JavaScript, Lua, Objective CAML, Perl, PHP, Python, Rebol, Ruby, Scala und Schema.

Sie werden feststellen, dass IANA.org keine dieser anderen Medientypen auflistet , sogar application/javascript ist jetzt veraltet. Also ist application/json wirklich die einzig mögliche richtige Antwort.

Browser-Unterstützung ist eine andere Sache.

Die am häufigsten unterstützten nicht standardmäßigen Medientypen sind text/json oder text/javascript. Aber einige große Namen benutzen sogar text/plain.

Noch seltsamer ist der von Flickr gesendete Content-Type-Header, der JSON als text/xml zurückgibt. Google verwendet text/javascript für einige seiner Ajax-Apis.

Beispiele:

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

Ausgabe: Content-Type: text/javascript

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

Ausgabe: Content-Type: text/xml

105
user1596138

Der richtige MIME-Typ ist application/json

BUT

Ich habe viele Situationen erlebt, in denen der Browsertyp oder der Framework-Benutzer Folgendes benötigte:

_text/html

application/javascript
_
87
LombaX

Ich benutze das Folgende

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

Der Header Content-Type sollte beim Posten auf 'application/json' gesetzt werden. Der Server, der auf die Anforderung wartet, sollte "Accept = application/json" enthalten. In Spring MVC kannst du das so machen:

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

Fügen Sie der Antwort Header hinzu:

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

In Spring haben Sie einen definierten Typ: MediaType.APPLICATION_JSON_VALUE, der application/json entspricht.

58

Der application/json funktioniert hervorragend in PHP, um ein Array oder Objektdaten zu speichern.

Ich verwende diesen Code, um Daten in JSON auf Google Cloud Storage (GCS) zu setzen, das öffentlich sichtbar ist :

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

Das Zurückholen der Daten ist ganz einfach:

$data = json_decode(file_get_contents("gs://BUCKETNAME/FILENAME.json"));
57
Chetabahana

Für JSON verwende ich:

 Content-Type: application/json

Dies ist im Vorschlag für das JSON Data Interchange Format 7158 der IETF beschrieben Abschnitt 1.2: Spezifikationen von JSON .

49
Mehmet_

Wenn der JSON mit Auffüllung versehen ist, ist dies application/jsonp. Wenn der JSON ohne Auffüllung ist, ist es application/json.

Um mit beidem fertig zu werden, ist es eine gute Praxis, 'application/javascript' zu verwenden, ohne sich darum zu kümmern, ob es mit oder ohne Auffüllung ist.

49
Ankit Zalani

Erweitern der akzeptierten Antworten, wenn Sie JSON in einem REST -Kontext verwenden ...

Es gibt ein starkes Argument zur Verwendung von application/x-resource+json und application/x-collection+json, wenn Sie REST Ressourcen und Sammlungen darstellen.

Und wenn Sie sich entscheiden, die jsonapi Spezifikation zu befolgen, Sie sollten verwenden Sie application/vnd.api+json, wie es dokumentiert ist.

Obwohl es keinen universellen Standard gibt, ist es klar, dass die den übertragenen Ressourcen hinzugefügte Semantik einen expliziteren Inhaltstyp rechtfertigt als nur application/json.

Nach dieser Überlegung könnten andere Kontexte einen spezifischeren Inhaltstyp rechtfertigen.

42
jgomo3

PHP-Entwickler verwenden dies:

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

    // Do something here...
?>
41
user3087089

Wenn Sie Daten von der REST -API in JSON abrufen, müssen Sie den Inhaltstyp verwenden

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
38
Krishna

JSON (JavaScript Object Notation) und JSONP ("JSON with padding") scheinen sehr ähnlich zu sein und daher ist es möglicherweise sehr verwirrend, welchen MIME-Typ sie haben sollte mit. Obwohl die Formate ähnlich sind, gibt es einige subtile Unterschiede zwischen ihnen.

Wenn also Zweifel bestehen, habe ich einen sehr einfachen Ansatz (der in den meisten Fällen einwandfrei funktioniert), nämlich das entsprechende RFC-Dokument zu überprüfen.

JSONRFC 4627 (Der application/json-Medientyp für JavaScript-Objektnotation (JSON)) ist eine Spezifikation von JSON Format. In Abschnitt 6 heißt es, dass der MIME-Medientyp für JSON-Text ist

application/json.

JSONP JSONP ("JSON with padding") wird in einem Browser anders behandelt als JSON. JSONP wird als reguläres JavaScript-Skript behandelt und sollte daher application/javascript, als aktuellen offiziellen MIME-Typ für JavaScript verwenden. In vielen Fällen funktioniert jedoch auch der MIME-Typ text/javascript.

Beachten Sie, dass text/javascript durch RFC 4329 (Scripting Media Types) als veraltet markiert wurde, und es wird empfohlen, stattdessen den Typ application/javascript zu verwenden. Aus älteren Gründen wird text/javascript jedoch immer noch häufig verwendet und unterstützt Cross-Browser (was bei application/javascript MIME-Typen, insbesondere bei älteren Browsern, nicht immer der Fall ist).

24

Content-Type: application/json - json
Content-Type: application/javascript - json-P
Content-Type: application/x-javascript - Javascript
Content-Type: text/javascript - Javascript ABER veraltete, ältere IE Versionen, die als HTML-Attribut verwendet wurden.
Content-Type: text/x-javascript - JavaScript-Medientypen ABER veraltet
Content-Type: text/x-json - json vor Antragstellung/json wurde offiziell registriert.

23
Kashif Solangi

Um das interessante JSON-Ergebnis anzugeben, fügen Sie "application/json" wie folgt in den Anforderungsheader ein:

"Accept: application/json" ist ein gewünschtes Antwortformat.

"Content-Type: application/json" gibt das Inhaltsformat Ihrer Anfrage an, aber manchmal geben Sie sowohl application/json als auch application/xml an, aber die Qualität dieser kann unterschiedlich sein. Welcher Server die verschiedenen Antwortformate zurücksendet, sehen Sie sich das Beispiel an:

Accept:application/json;q=0.4,application/xml;q=8

Dies gibt XML zurück, da XML eine höhere Qualität aufweist.

7
behzad babaei

Der richtige aktuelle Standard ist application/json. Während die Standardkodierung UTF-8 ist, sollte erwähnt werden, dass es sich auch um UTF-16 oder utf-32 handeln kann. Wenn JSON in UTF-16 oder UTF-32 geschrieben ist, muss die binäre Inhaltsübertragungscodierung verwendet werden.

Weitere Informationen zu json finden Sie hier: https://tools.ietf.org/html/rfc4627

weitere Informationen zur binären Übertragungscodierung finden Sie hier: https://www.w3.org/Protocols/rfc1341/5_Content-Transfer-Encoding.html

6
sammyb123

Ergänzend zu den restlichen Antworten lautet der MIME-Typ für JSON-verknüpfte Daten (JSON-LD) gemäß W3C :

application/ld+json

Typname: Anwendung

Name des Untertyps: ld + json

Zusätzlich aus derselben Quelle:

Dateierweiterung (en) :

.jsonld

6
alejnavab

Versuchen Sie immer, sich diese drei Inhaltstypen zu merken, obwohl es viele Inhaltstypen gibt. da Sie diese möglicherweise häufiger verwenden müssen.

  • Inhaltstyp: Anwendung/json
  • Inhaltstyp: application/xml
  • Inhaltstyp: Text/HTML
3
cherankrish