Was ist der richtige JSON-Inhaltstyp?


10253

Ich habe einige Zeit mit JSON herumgespielt , es nur als Text herausgeschoben und es hat niemanden verletzt (von dem ich weiß), aber ich würde gerne anfangen, die Dinge richtig zu machen.

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 Browserunterstützungsprobleme gibt, die zwischen ihnen variieren.

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.

Antworten:


10309

Für JSON-Text:

application/json

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

Für JSONP (ausführbares Javascript) mit Rückruf:

application/javascript

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



Kann ich Json-Text zusammen senden?
OPV

7
Internet Explorer hat manchmal Probleme mit der Anwendung / json - Blog ist offline
kudlatiger

6
Stellen Sie sich vor, ich habe ein Dokument von jemandem geschrieben, das einfachen Text enthält. Jetzt ist dieser einfache Text auch nur noch gültiger JSON. Wäre es dann falsch, Text / Plain als MIME-Typ zu verwenden? JSON ist ein SUB-TYP von Text. Also denke ich, dass beide erlaubt sein sollten. Die Frage ist, was in der Praxis besser funktioniert. Laut Kommentar von codetoshare hat IE Probleme mit application / json. Aber kein Browser sollte Probleme mit Text / Plain haben. Wenn Text / Plain unsicher ist, wie kann ich dann Textdateien von meiner Website bereitstellen?
Panu Logic

5
@ EugenMihailescu Der Titel dieser Seite ist "Unvollständige Liste der MIME-Typen"
Omegastick

1617

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

Auf die Frage, warum nicht text/json, scheint Crockford gesagt zu haben, dass JSON weder JavaScript noch Text ist und dass IANA eher verteilt application/*als text/*.

Mehr Ressourcen:


166
In text/*den frühen Tagen wurden viele Dinge in die Sektion aufgenommen, die heutzutage wahrscheinlich in die application/*Sektion kommen würden.
TRiG

29
@Rohmer - Sie können alles in einem Texteditor "öffnen", aber ein Binärformat wie JPEG oder eine Windows-EXE-Datei oder eine ZIP-Datei enthält nicht druckbare Zeichen, die tatsächlich viele Texteditoren beschädigen oder unerwünschtes Verhalten verursachen können. Versuchen Sie cat file.jpgzum Beispiel zu laufen . Während jede XML- oder JSON-Datei zu 100% druckbar ist. Ich denke also, dass Stijn de Witts Argument gültig ist, obwohl es ja zu spät ist, sich jetzt zu ändern.
XP84

4
@ XP84 Sie können jede Binärdatei mit einem Texteditor in HEX-Form öffnen. Und alle verschiedenen Zeichen (die 16) sind zu 100% druckbar. Also, nach dieser Logik ... sind alle Binärdateien Text? Json ist kein Text. Json ist (Warnung: informelle lose Definition voraus) eine Textdarstellung eines Objekts (oder eines Arrays von Objekten)
xDaizu

5
Der Ausdruck "ein Texteditor in HEX-Form" hat keine Bedeutung. Ein Hex-Editor zeigt jedes Byte als seinen Hexadezimalwert an, beispielsweise das Byte 1111000 als "78". Während es einige Texteditoren gibt, die zufällig auch einen Hex-Bearbeitungsmodus haben, ist dies weder üblich noch nützlich für etwas anderes als die technischsten Benutzer, die die technischsten Aufgaben ausführen. Im Vergleich dazu bedeutet Text ASCII oder Unicode, und im Text bedeutet das Byte 1111000 Kleinbuchstaben x. Nicht 78. JSON ist Text genauso wie HTML (Text / HTML). Es enthält nur lesbare Textzeichen mit strukturierter Bedeutung.
XP84

11
Ich stimme Stijn de Witt eher zu. JSON soll mit einem Texteditor angezeigt und bearbeitet werden.
Panu Logic

891

Für JSON:

Content-Type: application/json

Für JSON-P :

Content-Type: application/javascript

62
JSONP ist nicht wirklich JSON, es ist eine Technik zum Übergeben eines JavaScript-Objektliteral
Benjamin Gruenbaum

632

Natürlich ist der richtige MIME-Medientyp für JSON application/json, aber Sie müssen wissen, welcher Datentyp in Ihrer Anwendung erwartet wird.

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

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

Bei Verwendung des Antworttyps application / json schlägt der Browser vor, 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);
    }
};

7
Die Serverantwort muss als Text / HTML lauten. Dies gilt auch für die ExtJS-Variante.
Begley

463

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, um die ein Funktionsaufruf gewickelt ist.

Beispiel:

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

Inhaltstyp: application/javascript


46
Die Definition von JSON ist falsch. Es muss nicht dynamisch generiert werden oder Abfrageparameter berücksichtigen. Sie können eine statische JSON-Datei bereitstellen. Die am besten bewertete Antwort enthält außerdem einen Link zum RFC.
Styfle

10
JSONP können auch JSON-Daten sein, die einer Variablen zugewiesen sind.
Jimmy Kane

401

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 dies hauptsächlich, weil ich die Firefox-Erweiterung JSONView verwenden möchte

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

application/json json

Starten Sie dann Apache neu:

sudo service apache2 restart

44
Normalerweise reicht ein Neuladen aus (schneller als ein Neustart). Beachten Sie außerdem, dass Sie jetzt "sudo service apache2 reload" ausführen können.
Noamtm

19
Ubuntu 12.04 hat dies standardmäßig
Prizoff

386

Wenn Sie ASP.NET Web Services vom Client aus aufrufen, müssen Sie es verwenden, application/jsondamit es funktioniert. Ich glaube, dass dies auch für die Frameworks jQuery und Ext gilt .


20
jQuery scheint mindestens mit 'application / json' und 'text / plain' zu funktionieren ... Ich habe jedoch nicht alle anderen ausprobiert.
Nathan

jQuery ist in der Lage die Arbeit mit 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

Der richtige Inhaltstyp für JSON ist, es sei application/jsondenn, Sie verwenden JSONP , auch als JSON mit Auffüllung bekannt. Dies ist eigentlich JavaScript und daher der richtige Inhaltstyp application/javascript.


296

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

Aber ich hatte einige Erfahrungen, die ich application/x-javascriptaufgrund einiger Komprimierungsprobleme verwenden musste. Meine Hosting-Umgebung ist Shared Hosting mit GoDaddy . Sie erlauben mir nicht, Serverkonfigurationen zu ändern. Ich hatte der web.configDatei 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 JSON-Antworten jedoch überhaupt nicht.

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 zu verwenden

application/x-javascript

Nur wenn Sie Ihre JSON-Antworten in einer gemeinsam genutzten Hosting-Umgebung komprimieren möchten . Da beim Shared Hosting die IIS- Konfigurationen nicht geändert werden können .


11
"Ich persönlich empfehle die Verwendung von application / x-javascript" ist der Punkt, an dem diese Antwort irreführend wird. GoDaddy erlaubt die Komprimierung von application/json, ich nutze es für mein Shared Hosting und würde nicht empfehlen, einen anderen Inhaltstyp zu verwenden, um die Komprimierung zu aktivieren. Es ist einfach falsch. Es kann getan werden, aber es wird immer noch falsch sein. Die Verwendung unterschiedlicher Inhaltstypen für die Browserunterstützung ist eine Sache, die Verwendung unterschiedlicher Inhaltstypen für die serverseitige Komprimierung eine andere.

269

Nur bei Verwendung application/jsonals MIME- Typ habe ich Folgendes (Stand November 2011 mit den neuesten Versionen von Chrome, Firefox mit Firebug ):

  • Keine Warnungen mehr von Chrome, wenn der JSON vom Server geladen wird.
  • Firebug fügt der Antwort eine Registerkarte hinzu, auf der die formatierten JSON-Daten angezeigt werden. Wenn der MIME-Typ unterschiedlich ist, wird er nur als "Antwortinhalt" angezeigt.

244

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

Wenn Sie das Ext JS- Formular zum Hochladen von Dateien verwenden, beachten Sie, dass die Serverantwort vom Browser analysiert wird, um das Dokument für das zu erstellen <iframe>.

Wenn der Server JSON zum Senden des Rückgabeobjekts verwendet, Content-Typemuss der Header auf gesetzt werdentext/html werden, damit der Browser den Text unverändert in den Dokumententext einfügen kann.

Weitere Informationen finden Sie in der Dokumentation zur Ext JS 3.4.0-API .


40
Werkzeuge, die nicht den Standards entsprechen, sollten nach Möglichkeit vermieden werden. Verwendung application/jsonpro Spezifikation.
one.beat.consumer

15
@ one.beat.consumer Das ist zwar wahr, aber nicht spezifisch für ExtJs an sich. Dies ist eine Browser-Einschränkung (oder besser gesagt eine "Sicherheitsmaßnahme").
Hendy Irawan

7
Sicherlich wäre es besser, Text / Plain zu verwenden, damit keine HTML-Semantik auf Nicht-HTML-Inhalte angewendet wird. Oder können Sie mit Browsern den Inhalt eines Frames nicht extrahieren, wenn er kein DOM enthält?
Synchro

5
So fügen Sie weitere Verwirrung: Ich bin das Debuggen nur einen ähnlichen Fall auf dem Samsung Galaxy Beam (Android 2.3) mit Standard - Browser, und das iframescheint Feuer loadEreignis für application/javascript, application/x-javascript, text/javascript, text/plain, aber nicht feuern sie für application/jsonnoch text/html. Bis heute macht Android <= 2.3 etwa 50% des Android-Marktanteils aus.
Jakub.g

226

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 clientgesteuert, text/plainkann also für die Übertragung von Bytes gelten, aber dann würden Sie die Interpretation unnötig auf die Anwendungsdomäne des Anbieters übertragen - application/json. Würden Sie XML über übertragen text/plain?

Aber ehrlich gesagt ist Ihre Wahl des MIME-Typs ein Ratschlag für den Kunden, wie die Daten zu interpretieren sind - text/plainoder text/HTML(wenn es sich nicht um HTML handelt) wie das Löschen von Daten - es ist ebenso wenig aussagekräftig wie das Erstellen aller Objekte vom Typ Object in einer typisierten Sprache.

Keine mir bekannte Browser-Laufzeit nimmt ein JSON-Dokument und stellt es der Laufzeit automatisch als JavaScript-zugängliches Objekt ohne Intervention zur Verfügung. Wenn Sie jedoch mit einem verkrüppelten Client arbeiten, ist dies eine ganz andere Sache. Aber das ist nicht die ganze Geschichte - RESTful JSON-Dienste 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 stattdessen eine HTML-Injection über einen Ajax- Template-Service in Betracht ziehen .

Anwendung / JSON!


210

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

Der richtige HTTP-Inhaltstyp wäre application/json, wie andere bereits hervorgehoben haben, aber einige Clients gehen nicht sehr gut damit um. Deshalb empfiehlt jQuery die Standardeinstellung text/html.



166

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

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

  • application/x-javascript: Der experimentelle MIME-Typ für JavaScript wurde zuvor application/javascriptzum Standard gemacht.

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

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

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

Alles in allem sollten Sie diesen Link überprüfen, wenn Sie Zweifel an den Inhaltstypen haben


15
Wann ist text/javascriptobsolet geworden? Ich fülle immer noch HTML-Dokumente mit <script type="text/javascript" ...Tags.
Oli

7
Für Browser macht das eigentlich keinen Unterschied. Es ist nur veraltet für RFC-Standards: rfc-editor.org/rfc/rfc4329.txt
fcm

16
@Oli können Sie sicher fallen lassen type="text/javascript"und nur <script>...</script>mindestens gemäß HTML5 tun .
TCB13

149

In JSP können Sie dies in der Seitenanweisung verwenden:

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

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


115

" 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

Die IANA-Registrierung fürapplication/json sagt

Anwendungen, die diesen Medientyp verwenden: JSON wurde verwendet, um Daten zwischen Anwendungen auszutauschen, die in all diesen Programmiersprachen geschrieben wurden: ActionScript, C, C #, Clojure, ColdFusion, Common Lisp, E, Erlang, Go, Java, JavaScript, Lua, Objective CAML, Perl, PHP, Python, Rebol, Ruby, Scala und Schema.

Sie werden feststellen, dass IANA.org keinen dieser anderen Medientypen auflistet , sondern sogar application/javascriptveraltet ist. Also application/jsonist 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/jsonoder text/javascript. Aber einige große Namen verwenden sogar text/plain.

Noch seltsamer ist der Content-Type-Header von Flickr, der JSON als zurückgibt text/xml. Google verwendet text/javascriptfü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


90

Der richtige MIME-Typ ist application/json

ABER

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

text/html

application/javascript

10
Beispiel für eine solche Situation?
Mark Amery

75

Ich benutze das unten

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

66

Der Content-Type- Header sollte beim Posten auf ' application / json ' gesetzt werden. Der Server, der auf die Anforderung wartet, sollte " Accept = application / json " enthalten. In Spring MVC können Sie dies folgendermaßen tun:

@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");


59

Das application/jsonfunktioniert hervorragend in PHP, um Array- oder Objektdaten zu speichern.

Ich verwende diesen Code, um Daten in JSON in Google Cloud Storage (GCS) abzulegen, 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 unkompliziert:

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

50

Wenn der JSON aufgefüllt ist, ist dies der Fall application/jsonp. Wenn der JSON ohne Auffüllung ist, ist dies der Fall application/json.

Um mit beiden fertig zu werden, ist es eine gute Praxis, 'application / javascript' zu verwenden, ohne sich darum zu kümmern, ob es sich um Polsterung oder um Polsterung handelt.


8
Der erste Teil Ihrer Antwort ist falsch. "application / jsonp" ist kein gültiger MIME-Typ. Der Antworttext eines JSONP ist nur JavaScript, daher muss einer der MIME-Typen für JavaScript verwendet werden.
Rob W


43

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

Es gibt ein starkes Argument für die Verwendung application/x-resource+jsonund application/x-collection+jsondie Darstellung von REST-Ressourcen und -Sammlungen.

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

Obwohl es keinen universellen Standard gibt, ist es klar, dass die zusätzliche Semantik zu den übertragenen Ressourcen einen expliziteren Inhaltstyp als nur rechtfertigtapplication/json .

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


3
application/vnd.api+jsonscheint speziell für APIs zu sein, die json verwenden: api , eine sehr enge Spezifikation mit eigenen Erwartungen und Format. Ich verstehe es nicht für eine API, die json zurückgibt. Bitte korrigieren Sie mich, wenn ich falsch
liege

42

PHP-Entwickler verwenden dies:

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

    // Do something here...
?>

39

Wenn Sie Daten von der REST-API in JSON erhalten, 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

28

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 bevor application / json offiziell registriert wurde.


Für JSON-Text: application / json Inhaltstyp: application / json
Vikash Chauhan

28

Die Formate JSON (JavaScript Object Notation) und JSONP ("JSON with padding") scheinen sehr ähnlich zu sein, und daher kann es sehr verwirrend sein, welchen MIME-Typ sie verwenden sollten. Obwohl die Formate ähnlich sind, gibt es einige subtile Unterschiede zwischen ihnen.

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

JSON RFC 4627 ( JSON (Application / JSON Media Type für JavaScript Object Notation)) ist eine Spezifikation des JSON-Formats. In Abschnitt 6 heißt es, dass der MIME-Medientyp für JSON-Text lautet

application/json.

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

Beachten Sie, dass dies text/javascriptvom Dokument RFC 4329 (Scripting Media Types) als veraltet markiert wurde. Es wird empfohlen, application/javascriptstattdessen den Typ zu verwenden. Aus früheren Gründen text/javascriptist es jedoch immer noch weit verbreitet und wird browserübergreifend unterstützt (was beim application/javascriptMIME-Typ nicht immer der Fall ist , insbesondere bei älteren Browsern).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.