Qual é o tipo de conteúdo JSON correto?

Há algum tempo que ando a brincar com o JSON há algum tempo, apenas a empurrar para fora como texto e não magoou ninguém (que eu saiba), mas gostaria de começar a fazer as coisas como deve ser.

já vi por isso muitos pretensos "padrões" para o tipo de conteúdo JSON:

application/json
application/x-javascript
text/javascript
text/x-javascript
text/x-json
Mas qual é o correcto ou o melhor? Parece-me que há questões de segurança e de Apoio ao navegador que variam entre elas.

Sei que há uma pergunta semelhante., qual o tipo MIME se JSON é ser devolvida por uma API de descanso?, mas gostaria de uma resposta um pouco mais específica.

Author: Community, 2009-01-25

30 answers

Para o texto do JSON:

application/json

O tipo MIME para o texto JSON é application/json. A codificação por omissão é UTF-8. (Fonte: RFC 4627 ).

For JSONP (executável javascript) with callback:

application/javascript

Aqui estão alguns posts que foram mencionados nos comentários que são relevantes.
 9288
Author: Gumbo, 2018-09-01 05:13:59

A IANA {[7] } registou o tipo MIME oficial da JSON como application/json.

Quando perguntado sobre por que não text/json, Crockford parece ter dito que JSON não é realmente JavaScript nem texto e também IANA era mais propenso a distribuir {[[2]} do que text/*.

Mais recursos:

 1490
Author: gnrfan, 2017-01-17 20:53:54

Para JSON:

Content-Type: application/json

Para JSON-P:

Content-Type: application/javascript
 797
Author: Alix Axel, 2014-05-27 02:35:38

Claro, o tipo de mídia MIME correto para JSON é {[[2]}, mas é necessário perceber que tipo de dados é esperado em sua aplicação.

Por exemplo, eu uso Ext GWT e a resposta do servidor deve ir como text / html mas contém dados JSON.

lado do cliente, EXT GWT format 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");
    }
});

No caso de usar o tipo de respostaapplication/json , o navegador sugere-me que salve o ficheiro.

código-fonte do lado do servidor excerto com MVC de Primavera

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, 2015-05-04 22:37:14

JSON:

A resposta é gerada dinamicamente, de acordo com os parâmetros de consulta passados na URL.

Exemplo:

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

Tipo De Conteúdo: application/json


JSON-P:

JSON com enchimento. A resposta é JSON data, com uma chamada de função enrolada em torno dela.

Exemplo:

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

Tipo De Conteúdo: application/javascript

 433
Author: Bhavin, 2014-08-01 13:09:43

Se está a usar o Ubuntu ou o Debian e serve .JSON files through Apache, you might want to serve the files with the correct content type. Estou a fazer isto principalmente porque quero usar a extensão Firefox JSONView

O módulo Apache mod_ MIME irá ajudar a fazer isto facilmente. Contudo, com o Ubuntu, terá de editar o ficheiro /etc/mime.tipos e adicionar a linha

application/json json

Depois reinicie o Apache:

sudo service apache2 restart
 375
Author: Gourneau, 2014-06-30 16:56:26
Se estás a ligar ASP.NET serviços Web do lado do cliente você tem que usar application/json para que funcione. Creio que isto é o mesmo para os quadros jQuery e Ext.
 364
Author: markvpc, 2014-05-27 02:38:18

O tipo de conteúdo correcto para o JSON é application/json a menos que esteja a usar o JSONP, também conhecido como JSON with Padding, que na verdade é JavaScript e por isso o tipo de conteúdo correcto seria application/javascript.

 289
Author: Resist Design, 2014-05-27 02:39:25

Não há dúvida de que application/json é o melhor MIME tipo para uma resposta JSON.

Mas tive alguma experiência em que tive de usar por causa de alguns problemas de compressão. O meu ambiente de hospedagem é partilhado com o GoDaddy. Eles não me permitem mudar as configurações do servidor. Eu adicionei o seguinte código ao meu arquivo web.config para comprimir as respostas.
<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 isto, o ...as páginas aspx foram comprimidas com g-zip, mas as respostas JSON não foram. I adicionado
<add mimeType="application/json" enabled="true"/>

Nas secções estáticas e dinâmicas. Mas isto não comprime as respostas do JSON.

Depois disso removi este novo tipo e adicionei

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

Tanto nas secções estáticas como dinâmicas, e alterou o tipo de resposta em

.ashx (manipulador assíncrono) a

application/x-javascript
E agora descobri que as minhas respostas JSON foram comprimidas com G-zip. Por isso, recomendo pessoalmente a utilização de
application/x-javascript

Só se quiseres. comprimir as suas respostas JSON num ambiente de hospedagem partilhado . Porque em Hospedagem Compartilhada, eles não permitem que você mude as configurações IIS.

 279
Author: shashwat, 2017-11-09 08:31:59

Apenas quando utilizar application/json como MIME tipo eu tenho o seguinte (a partir de novembro de 2011, com as versões mais recentes do Chrome, Firefox com Firebug):

  • acabaram-se os avisos do Chrome quando o JSON é carregado a partir do servidor.
  • O Firebug irá adicionar uma página à resposta que mostra os dados do JSON. formatado. Se o tipo MIME é diferente, ele só vai aparecer como "Teor de resposta".
 254
Author: Ivo Limmen, 2013-07-25 15:52:33

Nem tudo funciona para o tipo de Conteúdo application/json.

Se estiver a utilizar Ext JS form submit to upload file, tenha em atenção que a resposta do servidor é processada pelo navegador para criar o documento para o <iframe>.

Se o servidor estiver a usar o JSON para enviar o objecto de retorno, então o cabeçalho Content-Type deve ser definido para text/html de modo a dizer ao navegador para inserir o texto inalterado no corpo do documento.

Ver a documentação da API da Ext JS 3.4.0.

 231
Author: Conan, 2013-08-02 15:53:02

O JSON é uma linguagem específica ao Domínio (DSL) e um formato de dados independente do JavaScript, e como tal tem o seu próprio MIME Tipo, application/json. O respeito pelos tipos MIME é, obviamente, conduzido pelo Cliente, pelo que text/plain pode fazer a transferência de 'bytes', mas então você estaria a aumentar a interpretação para o domínio da aplicação do Fornecedor desnecessariamente - application/json. Você transferiria XML via text/plain?

Mas honestamente, a sua escolha do tipo MIME é um conselho para o cliente sobre como interpretar os dados.- text/plain ou text/HTML (quando não é HTML) é como o tipo apagamento - é tão desinformativo como fazer todos os seus objetos de tipo objeto em uma linguagem tipada.

Nenhum tempo de execução do navegador que eu conheça irá pegar num documento JSON e torná-lo automaticamente disponível para o tempo de execução como um objeto acessível JavaScript sem intervenção, mas se você está trabalhando com um cliente aleijado, isso é uma questão completamente diferente. Mas essa não é a história toda- repousante Os serviços JSON muitas vezes não têm JavaScript mas isso não os impede de usar o JSON como um formato de intercâmbio de dados viável. Se os clientes são assim tão aleijados... então eu consideraria talvez a injeção de HTML através de um serviço de templateAjax .

Aplicação/JSON!

 215
Author: VLostBoy, 2014-12-11 16:48:17

Se estiver num ambiente do lado do cliente, investigar o suporte do navegador cruzado é obrigatório para uma aplicação web bem suportada.

O tipo de conteúdo HTTP certo seria {[[0]}, como outros já realçados também, mas alguns clientes não lidam muito bem com isso, é por isso que o jQuery recomenda o padrão text/html.

 199
Author: Emanuele Del Grande, 2013-02-23 15:37:55

A resposta correcta é:

Content-Type: application/json
 157
Author: Irfan DANISH, 2014-11-22 11:11:31

Como muitos outros já mencionaram, application/json é a resposta correcta.

Mas o que ainda não foi explicado é o que significam as outras opções que propôs.
  • application/x-javascript: tipo MIME Experimental para JavaScript antes de application/javascript ter sido feito padrão.

  • text/javascript: agora obsoleto. Deve usar application/javascript ao usar javascript.

  • text/x-javascript: tipo MIME Experimental para a situação acima.

  • text/x-json: tipo MIME Experimental para o JSON antes do registo oficial.

Em suma, sempre que tiver dúvidas sobre os tipos de conteúdo, deve verificar este link

 154
Author: fcm, 2015-08-17 20:05:26

Em JSP , pode usar isto na Directiva Página:

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

O tipo correcto MIME para o JSON é application/json. A JSP irá usá-lo para enviar uma resposta ao cliente.

 138
Author: raja, 2014-08-05 07:08:05

"application/json" é o tipo de conteúdo JSON correto.

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, 2014-02-25 17:59:57

O registo IANA para application/json diz:

Aplicações que usam este tipo de suporte: o JSON foi usado para intercâmbio de dados entre aplicações escritas em todas estas linguagens de programação: ActionScript, C, C#, Clojure, ColdFusion, Common Lisp, e, Erlang, Go, Java, JavaScript, Lua, Objective CAML, Perl, PHP, Python, Rebol, Ruby, Scala e Scheme.

Vais reparar que ... IANA.org não enumera nenhuma destas outras tipos de mídia , de fato até application/javascript está agora obsoleto. Então application/json é realmente a única resposta possível correcta. O Suporte do navegador é outra coisa.

Os tipos de mídia não-padrão mais amplamente suportados são text/json ou text/javascript. Mas alguns grandes nomes até usam text/plain.

Ainda mais estranho é o cabeçalho do tipo de conteúdo enviado pelo Flickr, que devolve JSON como text/xml. O Google usa text/javascript algumas das apis do ajax.

Exemplos:

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

Resultado: Content-Type: text/javascript

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

Resultado: Content-Type: text/xml

 96
Author: Lucky Kleinschmidt, 2018-04-12 15:49:49

O tipo MIME certo é application/json

MAS

Experimentei muitas situações em que o tipo de browser ou o utilizador do framework necessitavam:

text/html

application/javascript
 81
Author: LombaX, 2014-02-25 17:59:47

Eu uso o abaixo

contentType: 'application/json',
data: JSON.stringify(SendData),
 69
Author: Andro, 2013-05-17 09:52:13

O cabeçalho Content-Type deve ser definido em 'application/json' ao publicar. O servidor que ouve o pedido deve incluir " Accept=application / json ". Na primavera MVC você pode fazer isso assim:

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

Adicionar cabeçalhos à resposta:

HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
 61
Author: Alexander Burakevych, 2013-08-09 10:49:18

O application/json funciona muito bem no PHP para armazenar um array ou um objecto dado.

Uso este código para colocar dados no JSON em Google Cloud Storage (GCS)) que é visível publicamente :

$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 obter de volta os dados são para a frente:

$data = json_decode(file_get_contents("gs://BUCKETNAME/FILENAME.json"));
 52
Author: Chetabahana, 2018-01-17 02:33:44

Se o JSON estiver com enchimento, então será {[[0]}. Se o JSON estiver sem enchimento então será application/json.

Para lidar com ambos, é uma boa prática usar: 'application / javascript' sem se preocupar se é com enchimento ou sem enchimento.

 46
Author: Ankit Zalani, 2013-07-10 22:16:37

Para o JSON, estou a usar:

 Content-Type: application/json

Esta informação encontra-se descrita no formato de intercâmbio de dados JSON do IETF, 7158 proposta, ponto 1.2: especificações do JSON.

 46
Author: Mehmet_, 2016-01-02 04:03:22

Os programadores do PHP usam isto:

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

    // Do something here...
?>
 39
Author: Peter Mortensen, 2014-07-19 21:49:42

Alargar as respostas aceites, quando se está a usar o JSON num contexto de descanso...

Existe um argumento forte sobre o uso de {[[0]} e application/x-collection+json quando você está a representar os recursos de repouso e as colecções.

E se decidir seguir a especificação jsonapi , deve Utilizar application/vnd.api+json, Tal como está documentado.

Embora não exista uma norma universal, é evidente que a semântica acrescentada aos recursos transferidos justifica uma mais explícito Tipo de conteúdo do que apenas application/json.

Seguindo este raciocínio, outros contextos poderiam justificar um tipo de conteúdo mais específico .

 39
Author: jgomo3, 2016-07-27 00:57:23

Se obtiver dados da API REST em JSON, terá de utilizar o tipo de conteúdo

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, 2016-04-21 08:44:40

JSON (notação de objeto JavaScript) e JSONP ("JSON with padding") formatos parece ser muito semelhante e por isso pode ser muito confuso qual o tipo MIME que eles devem estar usando. Mesmo que os formatos parecem ser muito semelhantes, há algumas diferenças sutis entre eles.

Por isso, sempre que tiver dúvidas, tenho uma abordagem muito simples (que funciona perfeitamente na maioria dos casos), a saber, ir e verificar o RFC correspondente. documento.

JSON RFC 4627 (o tipo de mídia application / json para notação de objeto JavaScript (JSON)) é uma especificação do formato JSON. Diz na secção 6 que o tipo de mídia MIME para o texto JSON é

application/json.

JSONP JSONP ("JSON with padding") é tratado de forma diferente do JSON, em um navegador. JSONP é tratado como um script JavaScript regular e por isso deve usar application/javascript, o tipo MIME oficial atual para JavaScript. Em muitos casos, no entanto, text/javascript o tipo MIME também funcionará bem.

Note que text/javascript foi marcado como obsoleto pelo documento RFC 4329 (Scripting Media Types) e recomenda-se a utilização do tipo application/javascript. No entanto, devido a razões antigas, text/javascript ainda é amplamente utilizado e tem suporte de navegador cruzado (o que nem sempre é um caso com application/javascript tipo MIME, especialmente com navegadores mais antigos).

 23
Author: Iresha Rubasinghe, 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 BUT obsolete, IE versões mais antigas usadas para usar como atributo html.
Content-type: text/x-javascript - tipos de suportes JavaScript mas obsoletos
Content-type: text/x-json - o json antes da candidatura/json foi oficialmente registado.

 16
Author: Kashif Solangi, 2018-04-16 00:12:50