¿Cuál es el tipo de contenido JSON correcto?

10256

He estado jugando con JSON durante algún tiempo, simplemente lo eliminé como texto y no ha lastimado a nadie (que yo sepa), pero me gustaría comenzar a hacer las cosas correctamente.

He visto así que muchos supuestos "normas" para el tipo de contenido JSON:

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

¿Pero cuál es la correcta o la mejor? Entiendo que hay problemas de seguridad y soporte del navegador que varían entre ellos.

Sé que hay una pregunta similar, ¿qué tipo MIME si JSON está siendo devuelto por una API REST? , pero me gustaría una respuesta un poco más específica.

Oli
fuente

Respuestas:

10311

Para texto JSON:

application/json

El tipo de medio MIME para el texto JSON es application/json. La codificación predeterminada es UTF-8. (Fuente: RFC 4627 ).

Para JSONP (JavaScript ejecutable) con devolución de llamada:

application/javascript

Aquí hay algunas publicaciones de blog que se mencionaron en los comentarios que son relevantes.

Gumbo
fuente
47
Lista completa de tipos MIME
Eugen Mihailescu
¿Puedo enviar un archivo junto con el texto Json?
OPV
77
Internet Explorer a veces tiene problemas con la aplicación / json - el blog está fuera de línea
kudlatiger
66
Imagine que tengo un documento escrito por alguien que contiene texto sin formato. Ahora ese texto plano también resulta ser JSON válido también. ¿Entonces estaría equivocado al usar text / plain como su tipo mime? JSON es un subtipo de texto. Así que creo que ambos deberían estar permitidos. La pregunta es cuál funciona mejor en la práctica. Según el comentario de codetoshare, IE tiene problemas con la aplicación / json. Pero ningún navegador debería tener problemas con text / plain. Si text / plain no es seguro, ¿cómo puedo servir archivos de texto desde mi sitio web?
Panu Logic
55
@EugenMihailescu El título de esa página es "Lista incompleta de tipos MIME"
Omegastick
1617

IANA ha registrado el tipo oficial MIME para JSON como application/json.

Cuando se le preguntó por qué no text/json, Crockford parece haber dicho que JSON no es realmente JavaScript ni texto y que IANA tenía más probabilidades de entregar application/*que text/*.

Más recursos:

gnrfan
fuente
166
Se introdujeron muchas cosas en la text/*sección en los primeros días que probablemente se incluirían en la application/*sección en estos días.
TRiG
29
@Rohmer: "Puede" abrir cualquier cosa en un editor de texto, pero un formato binario como JPEG o Windows .exe o .zip contendrá caracteres no imprimibles que pueden romper muchos editores de texto o causar un comportamiento no deseado. Intenta correr cat file.jpgpor ejemplo. Mientras que cualquier archivo xml o json es 100% imprimible. Así que creo que el punto de Stijn de Witt es válido, a pesar de que sí, es demasiado tarde para cambiar ahora.
XP84
44
@ XP84 Puede abrir cualquier binario con un editor de texto en forma HEX. Y todos los diferentes personajes (los 16 de ellos) son 100% imprimibles. Entonces, según esa lógica ... ¿ son todos los textos binarios? Json no es texto. Json es (advertencia: definición informal suelta por delante) una representación de texto de un objeto (o conjunto de objetos)
xDaizu
55
No hay ningún significado para la frase "un editor de texto en forma HEX". Un editor hexadecimal muestra cada byte como su valor hexadecimal, por ejemplo, el byte 1111000 como "78". Si bien puede haber algunos editores de texto que también tienen un modo de edición hexadecimal, esto no es común ni útil para nada más que para los usuarios más técnicos que realizan las tareas más técnicas. Texto, en comparación, significa ASCII o Unicode, y en texto, el byte 1111000 significa xcarácter en minúscula . No 78. JSON es texto exactamente de la misma manera que HTML (text / html). Contiene solo caracteres de texto legibles, con un significado estructurado en ellos.
XP84
11
Tiendo a estar de acuerdo con Stijn de Witt. JSON está destinado a ser visto y editado con un editor de texto.
Panu Logic
891

Para JSON:

Content-Type: application/json

Para JSON-P :

Content-Type: application/javascript
Alix Axel
fuente
6262
Sin embargo, JSONP no es realmente JSON, es una técnica para pasar un objeto JavaScript literal
Benjamin Gruenbaum
632

Por supuesto, el tipo de medio MIME correcto para JSON es application/json, pero es necesario darse cuenta de qué tipo de datos se espera en su aplicación.

Por ejemplo, uso Ext GWT y la respuesta del servidor debe ir como texto / html pero contiene datos JSON.

Lado del cliente, oyente de formulario Ext GWT

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

En caso de utilizar el tipo de respuesta application / json , el navegador me sugiere guardar el archivo.

Fragmento de código fuente del lado del servidor con 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);
    }
};
Mikhail.Mamaev
fuente
77
la respuesta del servidor debe ir como texto / html. Esto también es cierto para la variante ExtJS.
gbegley
463

JSON

La respuesta son datos generados dinámicamente, de acuerdo con los parámetros de consulta pasados ​​en la URL.

Ejemplo:

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

Tipo de contenido: application/json


JSON-P:

JSON con relleno. La respuesta son datos JSON, con una llamada de función envuelta alrededor.

Ejemplo:

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

Tipo de contenido: application/javascript

Bhavin
fuente
46
La definición de JSON es incorrecta. No necesita ser generado dinámicamente o respetar los parámetros de consulta. Puede servir un archivo JSON estático. Además, la respuesta más votada tiene un enlace al RFC.
styfle
10
También JSONP puede ser datos json asignados a una var.
Jimmy Kane
401

Si está utilizando Ubuntu o Debian y sirve archivos .json a través de Apache, es posible que desee servir los archivos con el tipo de contenido correcto. Estoy haciendo esto principalmente porque quiero usar la extensión JSONView de Firefox

El módulo Apache mod_mime ayudará a hacer esto fácilmente. Sin embargo, con Ubuntu necesita editar el archivo /etc/mime.types y agregar la línea

application/json json

Luego reinicie Apache:

sudo service apache2 restart
Gourneau
fuente
44
por lo general, una recarga es suficiente (más rápido que reiniciar). Además, tenga en cuenta que ahora puede hacer "sudo service apache2 reload".
noamtm
19
Ubuntu 12.04 tiene esto por defecto
Prizoff
386

Si llama a los servicios web ASP.NET desde el lado del cliente, debe usarlo application/jsonpara que funcione. Creo que esto es lo mismo para los marcos jQuery y Ext .

markvpc
fuente
20
jQuery parece funcionar con al menos 'application / json' y 'text / plain' ... Sin embargo, no he probado todos los demás.
Nathan
jQuery es capaz de trabajar con 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

El tipo de contenido correcto para JSON es A application/jsonMENOS que esté utilizando JSONP , también conocido como JSON con relleno, que en realidad es JavaScript, por lo que sería el tipo de contenido correcto application/javascript.

Diseño resistente
fuente
296

No hay duda de que application/jsones el mejor tipo MIME para una respuesta JSON.

Pero tenía algo de experiencia donde tuve que usar application/x-javascriptdebido a algunos problemas de compresión. Mi entorno de alojamiento es alojamiento compartido con GoDaddy . No me permiten cambiar las configuraciones del servidor. Agregué el siguiente código a mi web.configarchivo para comprimir las respuestas.

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

Al usar esto, las páginas .aspx se comprimieron con g-zip pero las respuestas JSON no. yo añadí

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

en las secciones de tipos estáticos y dinámicos. Pero esto no comprime las respuestas JSON en absoluto.

Después de eso, eliminé este tipo recién agregado y agregué

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

en las secciones de tipos estático y dinámico, y cambió el tipo de respuesta en

.ashx (controlador asíncrono) a

application/x-javascript

Y ahora descubrí que mis respuestas JSON estaban comprimidas con g-zip. Así que personalmente recomiendo usar

application/x-javascript

solo si desea comprimir sus respuestas JSON en un entorno de alojamiento compartido . Porque en el alojamiento compartido, no le permiten cambiar las configuraciones de IIS .

shashwat
fuente
11
"Así que personalmente recomiendo usar application / x-javascript" es donde esta respuesta se vuelve engañosa. GoDaddy permite la compresión application/json, lo aprovecho en mi alojamiento compartido y no sugeriría usar un tipo de contenido diferente para habilitar la compresión de todos modos, es simplemente incorrecto. Se puede hacer, pero aún estará mal. Usar diferentes tipos de contenido para el soporte del navegador es una cosa, usar diferentes tipos de contenido para la compresión del lado del servidor es otra.
269

Solo cuando lo uso application/jsoncomo tipo MIME tengo lo siguiente (a partir de noviembre de 2011 con las versiones más recientes de Chrome, Firefox con Firebug ):

  • No más advertencias de Chrome cuando el JSON se carga desde el servidor.
  • Firebug agregará una pestaña a la respuesta que le mostrará los datos JSON formateados. Si el tipo MIME es diferente, solo aparecerá como 'Contenido de respuesta'.
Ivo Limmen
fuente
244

No todo funciona para el tipo de contenido application/json.

Si está utilizando Ext JS form submit to upload file, tenga en cuenta que el navegador analiza la respuesta del servidor para crear el documento para el <iframe>.

Si el servidor está utilizando JSON para enviar el objeto devuelto, entonces el Content-Typeencabezado debe estar configurado text/htmlpara indicarle al navegador que inserte el texto sin cambios en el cuerpo del documento.

Consulte la documentación de la API Ext JS 3.4.0 .

Conan
fuente
40
Las herramientas que no se adhieren a los estándares deben evitarse siempre que sea posible; uso application/jsonpor espec.
one.beat.consumer
15
@ one.beat.consumer, aunque eso es cierto, no es específico de ExtJs per se. Es una limitación del navegador (o más bien, tal vez, una "medida de seguridad").
Hendy Irawan
77
¿Seguramente sería mejor usar text / plain para que no aplique ninguna semántica HTML al contenido que no sea HTML? ¿O los navegadores no le permiten extraer el contenido de un marco si no tiene DOM?
Synchro
55
Para añadir más confusión: Estoy depuración de un caso similar en el Samsung Galaxy Beam (Android 2.3) con el navegador por defecto, y el iframeparece incendios loadcaso de application/javascript, application/x-javascript, text/javascript, text/plain, pero no disparando por application/jsonni text/html. A partir de hoy, Android <= 2.3 es aproximadamente el 50% de la cuota de mercado de Android.
jakub.g
226

JSON es un lenguaje específico de dominio (DSL) y un formato de datos independiente de JavaScript, y como tal tiene su propia MIME tipo, application/json. El respeto por los tipos MIME está, por supuesto, impulsado por el cliente, por lo que text/plainpuede hacerlo por la transferencia de bytes, pero entonces estaría impulsando la interpretación al dominio de la aplicación del proveedor innecesariamente application/json. ¿Transferirías XML a través de text/plain?

Pero honestamente, su elección del tipo MIME es un consejo para el cliente sobre cómo interpretar los datos, text/plaino text/HTML(cuando no es HTML) es como borrar el tipo, es tan poco informativo como hacer que todos sus objetos de tipo Objeto en un lenguaje escrito.

Ningún tiempo de ejecución del navegador que conozca tomará un documento JSON y lo pondrá automáticamente a disposición como un objeto accesible a JavaScript sin intervención, pero si está trabajando con un cliente paralítico, es un asunto completamente diferente. Pero esa no es toda la historia: los servicios RESTful JSON a menudo no tienen tiempos de ejecución de JavaScript, pero no les impide usar JSON como un formato de intercambio de datos viable. Si los clientes están paralizados ... entonces consideraría quizás la inyección de HTML a través de un servicio de plantillas de Ajax .

Aplicación / JSON!

VLostBoy
fuente
210

Si se encuentra en un entorno del lado del cliente, es obligatorio investigar sobre la compatibilidad entre navegadores para una aplicación web bien compatible.

El tipo de contenido HTTP correcto sería application/json, como otros ya están resaltados también, pero algunos clientes no lo manejan muy bien, por eso jQuery recomienda el valor predeterminado text/html.

Emanuele Del Grande
fuente
170

La respuesta correcta es:

Content-Type: application/json
Irfan DANISH
fuente
166

Como muchos otros han mencionado, application/jsones la respuesta correcta.

Pero lo que aún no se ha explicado es lo que significan las otras opciones que propuso.

  • application/x-javascript: El tipo MIME experimental para JavaScript antes application/javascriptse hizo estándar.

  • text/javascript: Ahora obsoleto. Debe usar application/javascriptcuando use javascript.

  • text/x-javascript: Tipo MIME experimental para la situación anterior.

  • text/x-json: Tipo MIME experimental para JSON antes de application/jsonregistrarse oficialmente.

En general, siempre que tenga dudas sobre los tipos de contenido, debe consultar este enlace

fcm
fuente
15
¿Cuándo quedó text/javascriptobsoleto? Todavía estoy llenando documentos HTML con <script type="text/javascript" ...etiquetas.
Oli
77
Realmente no hay diferencia para los navegadores. Es obsoleto para los estándares RFC: rfc-editor.org/rfc/rfc4329.txt
fcm
16
@Oli puede soltar con seguridad type="text/javascript"y solo hacer <script>...</script>al menos según HTML5.
TCB13
149

En JSP , puede usar esto en la directiva de página:

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

El tipo de medio MIME correcto para JSON es application/json. JSP lo usará para enviar una respuesta al cliente.

raja
fuente
115

" application/json" Es el tipo de contenido JSON correcto.

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())
  }
}
Sukane
fuente
112

El registro de IANA paraapplication/json dice

Aplicaciones que utilizan este tipo de medios: JSON se ha utilizado para intercambiar datos entre aplicaciones escritas en todos estos lenguajes de programación: ActionScript, C, C #, Clojure, ColdFusion, Common Lisp, E, Erlang, Go, Java, JavaScript, Lua, Objective CAML, Perl, PHP, Python, Rebol, Ruby, Scala y Scheme.

Notarás que IANA.org no enumera ninguno de estos otros tipos de medios , de hecho, incluso application/javascriptahora está obsoleto. Entonces, application/jsonrealmente es la única respuesta correcta posible .

El soporte del navegador es otra cosa.

Los tipos de medios no estándar más ampliamente admitidos son text/jsono text/javascript. Pero incluso algunos grandes nombres usan text/plain.

Aún más extraño es el encabezado Content-Type enviado por Flickr, que devuelve JSON como text/xml. Google usa text/javascriptpara algunos de sus apis ajax.

Ejemplos:

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

Salida: Content-Type: text/javascript

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

Salida: Content-Type: text/xml


fuente
90

El tipo MIME correcto es application/json

PERO

Experimenté muchas situaciones en las que el tipo de navegador o el usuario del framework necesitaban:

text/html

application/javascript
LombaX
fuente
10
Ejemplo de tal situación?
Mark Amery
75

Yo uso el siguiente

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

El encabezado Content-Type debe establecerse en ' application / json ' al publicar. El servidor que escucha la solicitud debe incluir " Aceptar = aplicación / json ". En Spring MVC puedes hacerlo así:

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

Agregue encabezados a la respuesta:

HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
Alexander Burakevych
fuente
59

En Spring tiene un tipo definido: MediaType.APPLICATION_JSON_VALUEque es equivalente a application / json .

Chand Priyankara
fuente
2
Eso también es Java EE :: javax.ws.rs.core.MediaType
Eddie B
59

Los application/jsontrabajos grandes en PHP para almacenar una matriz u objeto de datos.

Utilizo este código para poner datos en JSON en Google Cloud Storage (GCS), que se puede ver públicamente :

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

Para recuperar los datos es sencillo:

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

Si el JSON está con relleno, entonces lo estará application/jsonp. Si el JSON no tiene relleno, entonces lo será application/json.

Para lidiar con ambos, es una buena práctica usar: 'application / javascript' sin molestar si es con relleno o sin relleno.

Ankit Zalani
fuente
8
La primera parte de tu respuesta es incorrecta. "application / jsonp" no es un tipo MIME válido. El cuerpo de respuesta de un JSONP es solo JavaScript, por lo que debe usarse uno de los tipos MIME para JavaScript.
Rob W
43

Ampliando las respuestas aceptadas, cuando está utilizando JSON en un contexto REST ...

Existe un fuerte argumento sobre el uso application/x-resource+jsony application/x-collection+jsoncuando representa recursos y colecciones REST.

Y si decide seguir la especificación jsonapi , debe usarla application/vnd.api+json, como está documentado.

Aunque no existe un estándar universal, está claro que la semántica agregada a los recursos que se transfieren justifica un tipo de contenido más explícito que simplementeapplication/json .

Siguiendo este razonamiento, otros contextos podrían justificar un tipo de contenido más específico .

jgomo3
fuente
3
application/vnd.api+jsonparece ser específicamente para apis que usan json: api , una especificación muy estrecha con sus propias expectativas y formato, no entiendo que sea para ninguna API que devuelva json. Por favor
corrígeme
42

Los desarrolladores de PHP usan esto:

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

    // Do something here...
?>
Peter Mortensen
fuente
39

Si obtiene datos de la API REST en JSON, debe usar el tipo de contenido

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
Krishna
fuente
28

Content-Type: application/json- json
Content-Type: application/javascript- json-P
Content-Type: application/x-javascript- javascript
Content-Type: text/javascript- javascript PERO obsoleto, las versiones anteriores de IE solían usarse como atributo html.
Content-Type: text/x-javascript- Tipos de medios JavaScript PERO obsoletos
Content-Type: text/x-json- json antes de que la aplicación / json se registrara oficialmente.

Kashif Solangi
fuente
Para texto JSON: application / json Content-Type: application / json
Vikash Chauhan
28

JSON (notación de objetos JavaScript) y JSONP formatos ("JSON with padding") parecen ser muy similares y, por lo tanto, puede ser muy confuso qué tipo de MIME deberían usar. Aunque los formatos son similares, existen algunas diferencias sutiles entre ellos.

Entonces, cuando tengo dudas, tengo un enfoque muy simple (que funciona perfectamente bien en la mayoría de los casos), es decir, ir y verificar el documento RFC correspondiente.

JSON RFC 4627 (La aplicación / json Media Type para JavaScript Object Notation (JSON)) es una especificación del formato JSON. En la sección 6 dice que el tipo de medio MIME para el texto JSON es

application/json.

JSONP JSONP ("JSON con relleno") se maneja de manera diferente que JSON, en un navegador. JSONP se trata como un script JavaScript normal y, por lo tanto, debe usar application/javascript,el tipo MIME oficial actual para JavaScript. Sin embargo, en muchos casos, el text/javascripttipo MIME también funcionará bien.

Tenga en cuenta que text/javascriptha sido marcado como obsoleto por el documento RFC 4329 (Tipos de medios de secuencias de comandos) y se recomienda utilizar el application/javascripttipo en su lugar. Sin embargo, debido a razones heredadas, text/javascripttodavía se usa ampliamente y tiene soporte para navegadores cruzados (que no siempre es un caso con el application/javascripttipo MIME, especialmente con navegadores más antiguos).

Iresha Rubasinghe
fuente