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


He estado jugando con JSON durante algún tiempo, simplemente empujándolo como texto y no le ha hecho daño a nadie (que yo sepa), pero me gustaría empezar a hacer las cosas correctamente.

He visto así que muchos supuestos "estándares" para el tipo de contenido JSON:

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

Pero ¿cuál es correcto, o mejor? Deduzco 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.

Author: Community, 2009-01-25

30 answers

Para texto JSON:

application/json

El tipo de medio MIME para 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 entradas de blog que se mencionaron en los comentarios que son relevantes.

 9288
Author: Gumbo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-01 05:13:59

IANA ha registrado el tipo MIME oficial 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 también IANA era más probable que repartiera application/* que text/*.

Más recursos:

 1490
Author: gnrfan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-17 20:53:54

Para JSON:

Content-Type: application/json

Para JSON-P:

Content-Type: application/javascript
 797
Author: Alix Axel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-27 02:35:38

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, utilizo Ext GWT y la respuesta del servidor debe ir como text/html pero contiene datos JSON.

Lado del cliente, 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");
    }
});

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

Fragmento de código fuente del lado del servidor usando 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);
    }
};
 592
Author: Mikhail.Mamaev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-04 22:37:14

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 }

Contenido-Tipo: application/json


JSON-P:

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

Ejemplo:

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

Contenido-Tipo: application/javascript

 433
Author: Bhavin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-01 13:09:43

Si está usando 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. Hago esto principalmente porque quiero usar la extensión de Firefox JsonView

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

application/json json

Luego reinicia Apache:

sudo service apache2 restart
 375
Author: Gourneau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-30 16:56:26

Si estás llamando ASP.NET Servicios Web desde el lado del cliente tienes que usar application/json para que funcione. Creo que esto es lo mismo para los marcos jQuery y Ext.

 364
Author: markvpc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-27 02:38:18

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

 289
Author: Resist Design,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-27 02:39:25

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

Pero tuve cierta experiencia en la que tuve que usar application/x-javascript debido a algunos problemas de compresión. Mi entorno de alojamiento es el alojamiento compartido con GoDaddy . No me permiten cambiar las configuraciones del servidor. Había agregado el siguiente código a mi archivo web.config para comprimir 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"/>

Usando esto, el .aspx pages fue comprimido con g-zip pero las respuestas JSON no lo fueron. Me añadido

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

En las secciones 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 encontré que mis respuestas JSON estaban comprimidas con g-zip. Así que personalmente recomiendo usar

application/x-javascript

Solo si quieres comprime tus respuestas JSON en un entorno de alojamiento compartido . Porque en el alojamiento compartido, no le permiten cambiar las configuraciones de IIS.

 279
Author: shashwat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-09 08:31:59

Solo cuando se utiliza application/json como el 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 muestra los datos JSON formatear. Si el tipo MIME es diferente, se mostrará como "Contenido de respuesta".
 254
Author: Ivo Limmen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-25 15:52:33

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

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

Si el servidor está usando JSON para enviar el objeto devuelto, entonces el encabezado Content-Type debe estar configurado en text/html para indicar al navegador que inserte el texto sin cambios en el cuerpo del documento.

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

 231
Author: Conan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-02 15:53:02

JSON es un lenguaje específico del dominio (DSL) y un formato de datos independiente de JavaScript, y como tal tiene su propio tipo MIME, application/json. El respeto por los tipos MIME es, por supuesto, impulsado por el cliente, por lo que text/plain puede hacer para la transferencia de bytes, pero entonces estaría empujando hacia arriba la interpretación al dominio de 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 al cliente sobre cómo interpretar los datos - text/plain o text/HTML (cuando no es HTML) es como el borrado de tipo - es tan poco informativo como hacer que todos sus objetos de tipo sean Objeto en un lenguaje escrito.

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

Application / JSON!

 215
Author: VLostBoy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-11 16:48:17

Si está en un entorno del lado del cliente, investigar sobre el soporte entre navegadores es obligatorio para una aplicación web bien soportada.

El tipo de contenido HTTP correcto sería application/json, como otros ya han resaltado, pero algunos clientes no lo manejan muy bien, por eso jQuery recomienda el predeterminado text/html.

 199
Author: Emanuele Del Grande,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-23 15:37:55

La respuesta correcta es:

Content-Type: application/json
 157
Author: Irfan DANISH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-22 11:11:31

Como muchos otros han mencionado, application/json es 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 de application/javascript se hizo estándar.

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

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

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

Con todo, siempre que tengas dudas sobre los tipos de contenido, debes revisar este enlace

 154
Author: fcm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-17 20:05:26

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

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

El tipo de medio MIME correcto para JSON esapplication/json. JSP lo utilizará para enviar una respuesta al cliente.

 138
Author: raja,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-05 07:08:05

"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())
  }
}
 106
Author: Sukane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-25 17:59:57

El IANA registro para application/json dice

Las aplicaciones que utilizan este tipo de medio: JSON se ha utilizado para intercambiar datos entre aplicaciones escritas en todas ellas 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.

Te darás cuenta de que IANA.org no lista ninguno de estos otros medios tipos , de hecho incluso application/javascript es ahora obsoleto. Así que application/jsones realmente la única respuesta correcta posible.

El soporte del navegador es otra cosa.

Los tipos de medios no estándar más soportados son text/json o text/javascript. Pero algunos grandes nombres incluso usan text/plain.

Aún más extraño es el encabezado Content-Type enviado por Flickr, que devuelve JSON como text/xml. Google utiliza text/javascript para algunas de sus api 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

 96
Author: Lucky Kleinschmidt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-12 15:49:49

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
 81
Author: LombaX,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-25 17:59:47

Utilizo el siguiente

contentType: 'application/json',
data: JSON.stringify(SendData),
 69
Author: Andro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-17 09:52:13

El encabezado Content-Type debe establecerse en ' application/json' al publicar. El servidor que escucha la solicitud debe incluir " Accept=application/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");
 61
Author: Alexander Burakevych,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-09 10:49:18

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

 54
Author: Chand Priyankara,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-10 22:17:11

El application/json funciona muy bien en PHP para almacenar una matriz u objeto datos.

Uso este código para poner datos en JSON en Almacenamiento en la nube de Google (GCS) que se establece públicamente visible :

$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"));
 52
Author: Chetabahana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-17 02:33:44

Si el JSON es con relleno entonces será application/jsonp. Si el JSON está sin relleno entonces será application/json.

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

 46
Author: Ankit Zalani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-10 22:16:37

Para JSON, estoy usando:

 Content-Type: application/json

Esto se describe en la propuesta del IETF JSON Data Interchange Format 7158, Sección 1.2: Especificaciones de JSON.

 46
Author: Mehmet_,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-02 04:03:22

Los desarrolladores de PHP usan esto:

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

    // Do something here...
?>
 39
Author: Peter Mortensen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-19 21:49:42

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

Hay un argumento fuerte sobre usar application/x-resource+json y application/x-collection+json cuando está representando recursos y colecciones REST.

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

Aunque no hay un estándar universal, está claro que la semántica añadida a los recursos que se transfieren justifica una más explicit Content-Type than just application/json.

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

 39
Author: jgomo3,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-27 00:57:23

Si obtiene datos de la API REST en JSON, debe usar 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
 37
Author: Krishna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-21 08:44:40

Los formatos JSON (Notación de objetos JavaScript) y JSONP ("JSON con relleno") parecen ser muy similares y, por lo tanto, podría ser muy confuso qué tipo MIME deberían usar. Aunque los formatos parecen ser muy similares, hay algunas diferencias sutiles entre ellos.

Así que cada vez que en cualquier duda, tengo un enfoque muy simple (que funciona perfectamente encontrar en la mayoría de los casos), a saber, ir y comprobar RFC correspondiente documento.

JSON RFC 4627 (application/json Media Type for JavaScript Object Notation (JSON)) es una especificación del formato JSON. Dice en la sección 6, que el tipo de medio MIME para 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 regular y por lo tanto debe usar application/javascript, el tipo MIME oficial actual para JavaScript. Sin embargo, en muchos casos, text/javascript El tipo MIME también funcionará bien.

Tenga en cuenta que text/javascriptha sido marcado como obsoleto por RFC 4329 (Scripting Media Types) documento y se recomienda utilizar application/javascript tipo en su lugar. Sin embargo, debido a razones heredadas, text/javascript todavía se usa ampliamente y tiene soporte para navegadores cruzados (lo que no siempre es un caso con el tipo MIME application/javascript, especialmente con navegadores más antiguos).

 23
Author: Iresha Rubasinghe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
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 PERO obsoleto, versiones más antiguas de IE se utilizan como atributo html.
Content-type: text/x-javascript - Tipos de medios JavaScript PERO obsoletos
Content-type: text/x-json - json antes de la aplicación / json se registró oficialmente.

 16
Author: Kashif Solangi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-16 00:12:50