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

He estado jugando con JSON durante algún tiempo, simplemente lo publica 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 so 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 la correcta o la mejor? Tengo entendido que existen problemas de seguridad y compatibilidad con el navegador que varían entre ellos.

Sé que hay una pregunta similar ¿Qué tipo de MIME si una API REST devuelve JSON?, pero me gustaría una respuesta un poco más específica.

preguntado el 25 de enero de 09 a las 13:01

30 Respuestas

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 publicaciones de blog que se mencionaron en los comentarios relevantes:

Respondido el 17 de Septiembre de 20 a las 16:09

¿realmente importa qué tipo de mimo tiene? es texto que se analiza en un objeto. ¿No sería más natural pasarlo como texto / sin formato si desea que se pueda abrir en el navegador sin forzar la descarga, y application / octet-stream si desea que se descargue automáticamente (útil si lo está generando en una página web destinada a guardarse localmente). ¿Realmente hay tanta gente que necesitará saber el tipo de mime para que el descargador pueda verlo con un visor json especial? ¿Qué me estoy perdiendo que lo justifique como un tipo de mimo especial? - Dmitry

Internet Explorer a veces tiene problemas con la aplicación / json - el blog está desconectado - kudlatiger

Imagina que tengo un documento escrito por alguien que contiene texto sin formato. Ahora, ese texto sin formato también es JSON válido. ¿Me equivocaría entonces al usar text / plain como su tipo de mimo? JSON es un SUBTIPO de texto. Entonces 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 application / json. Pero ningún navegador debería tener problemas con el texto o sin formato. Si texto / sin formato no es seguro, ¿cómo puedo servir archivos de texto desde mi sitio web? - Panu Lógica

@EugenMihailescu El título de esa página es "Lista incompleta de tipos MIME" - palo omega

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 es más probable que IANA distribuya application/* que text/*.

Más recursos:

Respondido el 17 de enero de 17 a las 20:01

Se pusieron muchas cosas en el text/* sección en los primeros días que probablemente se pondría en el application/* sección estos días. - Trigonometría

@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 provocar un comportamiento no deseado. Intenta correr cat file.jpg por 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í, ya es demasiado tarde para cambiar. - XP84

@ XP84 Puede abrir cualquier binario con un editor de texto en formato HEX. Y todos los diferentes personajes (los 16) son 100% imprimibles. Entonces, por esa lógica ... ¿Son todos los binarios texto? Json no es texto. Json es (advertencia: definición informal suelta más adelante) una representación de texto de un objeto (o matriz de objetos) - xDaizu

No tiene sentido la frase "un editor de texto en formato 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 tengan 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. El texto, en comparación, significa ASCII o Unicode, y en texto, el byte 1111000 significa minúsculas x personaje. No 78. JSON es texto exactamente de la misma manera que HTML (texto / html). Contiene solo caracteres de texto legibles, con un significado estructurado en ellos. - XP84

Tiendo a estar de acuerdo con Stijn de Witt. JSON está diseñado para ser visto y editado con un editor de texto. - Panu Lógica

Para JSON:

Content-Type: application/json

Para JSON-P:

Content-Type: application/javascript

contestado el 27 de mayo de 14 a las 03:05

JSONP no es realmente JSON, es una técnica para pasar un literal de objeto JavaScript - benjamin grünbaum

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

Por ejemplo, yo uso GWT externo y la respuesta del servidor debe ir como text / 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 usar aplicación / json tipo de respuesta, el navegador me sugiere que guarde el archivo.

Fragmento de código fuente del lado del servidor usando Primavera 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);
    }
};

contestado el 04 de mayo de 15 a las 23:05

La respuesta del servidor debe ser text / html. Esto también es cierto para la variante ExtJS. - gbegley

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

Respondido 01 ago 14, 14:08

La definición de JSON es incorrecta. No necesita generarse dinámicamente ni 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. - estilo

Además, JSONP pueden ser datos json asignados a una var. - jimmy kane

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

El módulo de Apache mod_mimo ayudará a hacer esto fácilmente. Sin embargo, con Ubuntu necesitas editar el archivo /etc/mime.tipos y agrega la línea

application/json json

Luego reinicia Apache:

sudo service apache2 restart

Respondido el 30 de junio de 14 a las 17:06

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

Ubuntu 12.04 tiene esto por defecto: Premio

Si está llamando a ASP.NET Web Services desde el lado del cliente, debe usar application/json para que funcione. Creo que esto es lo mismo para el jQuery y ext marcos.

contestado el 27 de mayo de 14 a las 03:05

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

El tipo de contenido correcto para JSON es application/json A MENOS QUE estés 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.

contestado el 27 de mayo de 14 a las 03:05

No hay duda de que application/json es la mejor MÍMICA escriba para una respuesta JSON.

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

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áticos y dinámicos, y cambió el tipo de respuesta en

.ashx (controlador asincrónico) para

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 hosting compartido no te permiten cambiar IIS configuraciones.

respondido 09 nov., 17:08

"Así que personalmente recomiendo usar application / x-javascript" es donde esta respuesta se vuelve engañosa. Ve papi permitir la compresión de 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, simplemente está mal. Se puede hacer, pero seguirá siendo incorrecto. Usando diferentes tipos de contenido para soporte de navegador Una cosa es usar diferentes tipos de contenido para la compresión del lado del servidor. - usuario1596138

Solo cuando se usa application/json como el MÍMICA tipo 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'.

Respondido 25 Jul 13, 16:07

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

Si está utilizando Ext JS enviar formulario para cargar el archivo, tenga en cuenta que el navegador analiza la respuesta del servidor para crear el documento para el <iframe>.

Si el servidor usa JSON para enviar el objeto de retorno, entonces el Content-Type el encabezado debe configurarse para text/html para decirle al navegador que inserte el texto sin cambios en el cuerpo del documento.

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

Respondido 02 ago 13, 16:08

Las herramientas que no se adhieran a los estándares deben evitarse siempre que sea posible; usar application/json por especificación. - one.beat.consumidor

@ one.beat.consumer, si bien eso es cierto, no es específico de los ExtJ en sí. Es una limitación del navegador (o más bien, quizás, una "medida de seguridad"). - hendy irwan

Seguramente sería mejor usar texto / sin formato 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? - Sincronizacion

Para agregar más confusión: solo estoy depurando un caso similar en Samsung Galaxy Beam (Android 2.3) con el navegador predeterminado, y el iframe parece disparar load evento para application/javascript, application/x-javascript, text/javascript, text/plain, pero NO dispararlo por application/json ni text/html. A día de hoy, Android <= 2.3 representa aproximadamente el 50% de la cuota de mercado de Android. - jakub.g

JSON es un lenguaje específico de dominio (DSL) y un formato de datos independiente de JavaScript, y como tal tiene su propio MÍMICA tipo, application/json. El respeto por los tipos MIME está, por supuesto, impulsado por el cliente, por lo que text/plain puede hacer para la transferencia de bytes, pero entonces estaría aumentando 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/plain or text/HTML (cuando no es HTML) es como el borrado de tipos: es tan poco informativo como crear todos sus objetos de tipo Object 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 del tiempo de ejecución como un objeto accesible de JavaScript sin intervención, pero si está trabajando con un cliente paralizado, eso es un asunto completamente diferente. Pero esa no es toda la historia Sosegado Los servicios JSON a menudo no tienen tiempos de ejecución de JavaScript, pero eso no les impide usar JSON como un formato de intercambio de datos viable. Si los clientes están tan lisiados ... entonces consideraría tal vez la inyección de HTML a través de un Ajax servicio de plantillas en su lugar.

Aplicación / JSON!

Respondido el 11 de diciembre de 14 a las 16:12

Si se encuentra en un entorno del lado del cliente, investigar sobre la compatibilidad con varios navegadores es obligatorio para una aplicación web con un buen soporte.

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

Respondido 23 Feb 13, 15:02

La respuesta correcta es:

Content-Type: application/json

respondido 22 nov., 14:11

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

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

  • application/x-javascript: Tipo MIME experimental para JavaScript antes application/javascript se hizo estándar.

  • text/javascript: Ahora obsoleto. Deberías usar application/javascript al usar javascript.

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

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

En general, siempre que tenga alguna duda sobre los tipos de contenido, debe verificar este enlace

Respondido 17 ago 15, 21:08

Cuando lo hizo text/javascript volverse obsoleto? Todavía estoy llenando documentos HTML con <script type="text/javascript" ... etiquetas. - Aceite

En realidad, no supone ninguna diferencia para los navegadores. Es simplemente obsoleto para los estándares RFC: rfc-editor.org/rfc/rfc4329.txt - FCM

@Oli puedes soltar con seguridad type="text/javascript" y solo hazlo <script>...</script> al menos de acuerdo con HTML5. - TCB13

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

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

Lo correcto MÍMICA el tipo de medio para JSON es application/json. JSP lo utilizará para enviar una respuesta al cliente.

Respondido 05 ago 14, 08:08

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

Respondido 25 Feb 14, 17:02

EL Registro IANA para application/json dice

Aplicaciones que utilizan este tipo de medio: 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/javascript ahora está obsoleto. Entonces application/json es realmente el único posible correcta responder.

La compatibilidad con el navegador es otra cosa.

Los tipos de medios no estándar más ampliamente admitidos son text/json or 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 usa text/javascript para 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

Respondido 12 Abr '18, 16:04

El tipo de MIME correcto es application/json

PERO

Experimenté muchas situaciones en las que el tipo de navegador o el usuario del marco necesitaba:

text/html

application/javascript

Respondido 25 Feb 14, 17:02

¿Ejemplo de tal situación? - marca amery

Yo uso el siguiente

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

contestado el 17 de mayo de 13 a las 10:05

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

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

Agrega encabezados a la respuesta:

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

Respondido 09 ago 13, 11:08

EL application/json funciona muy bien en PHP para almacenar una matriz o datos de objetos.

Utilizo este código para poner datos en JSON en Google Cloud Storage (GCS) que está configurado visible 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"));

Respondido el 17 de enero de 18 a las 02:01

In Primavera tienes un tipo definido: MediaType.APPLICATION_JSON_VALUE que es equivalente a aplicación / json.

Respondido 10 Jul 13, 23:07

Eso es Java EE también: javax.ws.rs.core.MediaType - Eddie B

Para JSON, estoy usando:

 Content-Type: application/json

Esto se describe en la propuesta del formato de intercambio de datos JSON 7158 del IETF, Sección 1.2: Especificaciones de JSON.

Respondido el 02 de enero de 16 a las 04:01

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

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

Respondido 10 Jul 13, 23:07

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 se debe usar uno de los tipos MIME para JavaScript. - Rob W

Los desarrolladores de PHP usan esto:

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

    // Do something here...
?>

Respondido 19 Jul 14, 22:07

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

Hay un argumento fuerte sobre el uso application/x-resource+json y application/x-collection+json cuando representa recursos y colecciones REST.

Y si decides seguir el jsonapi especificación, debieras uso de 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 una más explícita Content-Type que solo application/json.

Siguiendo este razonamiento, otros contextos podrían justificar un enfoque más específico. Content-Type.

Respondido 27 Jul 16, 01:07

application/vnd.api+json parece ser específicamente para apis usando json: api, una especificación muy limitada con sus propias expectativas y formato, no entiendo que sea para cualquier API que devuelve json. Por favor corrígeme si estoy equivocado - Hilikus

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

Respondido 21 Abr '16, 09:04

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 se usaban 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.

Respondido el 25 de enero de 19 a las 14:01

Para texto JSON: application / json Content-Type: application / json - vikash chauhan

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

Entonces, siempre que tenga alguna duda, tengo un enfoque muy simple (que funciona perfectamente bien en la mayoría de los casos), es decir, vaya y verifique el documento RFC correspondiente.

JSON RFC 4627 (El tipo de medio application / json para la notación de objetos JavaScript (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 a 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. En muchos casos, sin embargo, text/javascript El tipo MIME también funcionará bien.

Tenga en cuenta que text/javascript ha sido marcado como obsoleto por RFC 4329 (Tipos de medios de secuencia de comandos) y se recomienda utilizar application/javascript escriba en su lugar. Sin embargo, debido a razones heredadas, text/javascript todavía se utiliza ampliamente y tiene soporte para varios navegadores (que no siempre es un caso con application/javascript Tipo MIME, especialmente con navegadores más antiguos).

respondido 13 mar '19, 06:03

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.