Qual é o tipo correto de conteúdo JSON?

Passei algum tempo brincando com o JSON , apenas digitando como texto, e isso não machucou ninguém (o que eu sei), mas eu gostaria de começar a fazer as coisas direito.

Vi tantos "padrões" alegados para o tipo de conteúdo JSON:

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

Mas o que é certo ou melhor? Eu entendo que entre eles há problemas de segurança e suporte ao navegador.

Eu sei que há uma questão semelhante.O que é o tipo MIME se JSON é retornado pela API REST? mas eu gostaria de uma resposta um pouco mais focada.

9470
25 янв. definir por Oli 25 de janeiro 2009-01-25 18:25 '09 às 18:25 2009-01-25 18:25
@ 38 respostas
  • 1
  • 2

Para o texto JSON:

application/json

O tipo de mídia MIME para texto JSON é application/json . A codificação padrão é UTF-8. (Fonte: RFC 4627 ).

Para JSONP (javascript executável) com retorno de chamada:

application/javascript

Aqui estão alguns posts que foram mencionados nos comentários que são relevantes para o caso.

9468
25 янв. Gumbo respondeu em 25 de jan 2009-01-25 18:27 '09 às 18:27 2009-01-25 18:27

A IANA registrou o tipo MIME oficial para JSON como application/json .

Quando perguntado sobre por que não text/json , Crockford parece ter dito que JSON não é realmente JavaScript, mas texto, e é mais provável que IANA passe por application*" enabled="false"/> </dynamicTypes> <staticTypes> <add mimeType="text*" enabled="false"/> </staticTypes> </httpCompression> <urlCompression doStaticCompression="true" doDynamicCompression="true"/>

Usando isso, as páginas .aspx foram compactadas com g-zip, mas as respostas JSON não foram. Eu adicionei

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

em seções de tipos estáticos e dinâmicos. Mas isso não comprime as respostas JSON.

Depois disso, eu deletei esse novo tipo adicionado e adicionei

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

em seções de tipos estáticos e dinâmicos e mudou o tipo de resposta em

.ashx (manipulador assíncrono) em

 application/x-javascript 

E agora descobri que minhas respostas JSON foram compactadas com g-zip. Portanto, eu pessoalmente recomendo usar

 application/x-javascript 

somente se você quiser compactar suas respostas JSON em um ambiente de hospedagem pública . Porque eles não permitem que você altere as configurações do IIS na hospedagem compartilhada.

282
18 апр. a resposta é dada por shashwat 18 apr. 2012-04-18 11:22 '12 às 11:22 2012-04-18 11:22

Somente ao usar o application/json como MIME eu tenho o seguinte (desde novembro de 2011 com as últimas versões do Chrome, Firefox com Firebug ):

  • Não há mais avisos do Chrome ao baixar o JSON do servidor.
  • O Firebug adicionará uma guia à resposta mostrando dados formatados em JSON. Se o tipo MIME for diferente, ele será exibido como "Conteúdo de resposta".
257
30 нояб. A resposta é dada por Ivo Limmen 30 de novembro 2011-11-30 09:42 '11 at 9:42 2011-11-30 09:42

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

Se você usar o Ext JS para enviar um arquivo, lembre-se de que a resposta do servidor é analisada pelo navegador para criar um documento para o <iframe> .

Se o servidor usar JSON para enviar o objeto retornado, o cabeçalho Content-Type deverá ser definido como text/html para que o navegador insira texto sem alterações no corpo do documento.

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

232
07 сент. Conan respondeu em 07 de setembro 2011-09-07 05:41 '11 at 5:41 am 2011-09-07 05:41

JSON é uma linguagem de domínio (DSL) e formato de dados que é independente do JavaScript e, como tal, possui seu próprio MIME , application/json . O respeito pelos tipos MIME, obviamente, depende do cliente, portanto, o text/plain pode fazer a transferência de bytes, mas você interpretará desnecessariamente a interpretação do domínio do provedor de application/json - application/json . Você passa XML via text/plain ?

Mas, francamente, a sua escolha do tipo MIME é aconselhar o cliente sobre como interpretar os dados - text/plain ou text/HTML (quando não é HTML) - como apagar estilos - não é informativo, como criar todos os seus objetos em um text/HTML digitado idioma.

Falta de tempo de execução do navegador, que eu sei que vai pegar um documento JSON e automaticamente disponibilizá-lo para o tempo de execução como um objeto acessível para JavaScript, sem intervenção, mas se você estiver trabalhando com um cliente aleijado, isso é outra questão. Mas esta não é toda a história. Os serviços JSON RESTful geralmente não têm autonomia de JavaScript, mas isso não os impede de usar o JSON como um formato de troca de dados viável. Se os clientes estão danificados ... então eu acho que é possível que a injeção de HTML seja feita usando um modelo Ajax .

Aplicativo / JSON!

217
15 мая '12 в 1:19 2012-05-15 01:19 a resposta é dada por VLostBoy 15 de maio de '12 at 1:19 2012-05-15 01:19

Se você estiver em um ambiente do lado do cliente, a pesquisa de suporte entre navegadores será necessária para um aplicativo da Web bem suportado.

O tipo de conteúdo HTTP correto será application/json , já que outros já estão alocados também, mas alguns clientes não lidam com isso muito bem, então o jQuery recomenda usar o text/html padrão.

201
27 апр. A resposta é dada por Emanuele Del Grande 27 abr. 2012-04-27 19:27 '12 em 7:27 pm 2012-04-27 19:27

A resposta correta é:

 Content-Type: application/json 
159
31 дек. a resposta é dada por Irfan DANISH 31 dec. 2012-12-31 09:29 '13 em 9:29 2012-12-31 09:29

Como muitos outros, application/json é a resposta certa.

Mas ainda não é explicado o que as outras opções que você oferece significam.

  • application/x-javascript : O tipo MIME experimental para JavaScript antes do application/javascript era padrão.

  • text/javascript : agora obsoleto. Você deve usar o application/javascript ao usar o javascript.

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

  • text/x-json : tipo MIME experimental para JSON antes da application/json recebeu o registro oficial.

Em geral, sempre que tiver dúvidas sobre os tipos de conteúdo, você deve verificar este link.

156
02 апр. a resposta é dada fcm 02 abr 2013-04-02 14:10 '13 às 14:10 2013-04-02 14:10

No JSP, você pode usar isso na diretiva da página:

 <%@ page > 

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

139
19 янв. a resposta é dada raja 19 jan. 2013-01-19 11:22 '13 às 11:22 2013-01-19 11:22

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

 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()) } } 
108
26 февр. A resposta é dada por Sukane em 26 de fevereiro. 2013-02-26 14:55 '13 às 14:55 2013-02-26 14:55

O registro da IANA para o application/json diz

Aplicativos que usam esse tipo de mídia: o JSON foi usado para trocar dados entre aplicativos escritos em todas essas linguagens de programação: ActionScript, C, C #, Clojure, ColdFusion, Common Lisp, E, Er>

Você notará que o IANA.org não lista nenhum desses outros tipos de mídia , na verdade, até o application/javascript está desatualizado. Assim, application/json é realmente a única resposta correta.

Suporte de navegador é outra coisa.

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

Ainda mais estranho é o cabeçalho Content-Type enviado pelo Flickr, que retorna JSON como text/xml . O Google usa text/javascript para alguns deles ajax apis.

Exemplos:

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

Saída: Content-Type: text/javascript

 curl -I "https://www.flickr.com/services/rest/?method=flickr.test.echo> 

Saída: Content-Type: text/xml

98
12 февр. Resposta dada por Jhawins em 12 Fev 2014-02-12 19:12 '14 às 19:12 2014-02-12 19:12

O tipo correto é o application/json MIME application/json

MAS

Eu experimentei muitas situações quando precisei de um tipo de navegador ou de um usuário de framework:

 text/html application/javascript 
83
03 мая '13 в 19:00 2013-05-03 19:00 a resposta é dada LombaX 03 maio '13 às 19:00 2013-05-03 19:00

Eu uso abaixo

 contentType: 'application/json', data: JSON.stringify(SendData), 
70
16 мая '13 в 15:43 2013-05-16 15:43 a resposta foi dada por Andro em 16 de maio de 2013 às 15:43 2013-05-16 15:43

O cabeçalho do cabeçalho Content-Type deve ser definido como application / json ao publicar. O servidor que está atendendo a solicitação deve incluir " Accept = application / json ". No Spring MVC, você pode fazer isso da seguinte maneira:

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

Adicione cabeçalhos à resposta:

 HttpHeaders headers = new HttpHeaders(); headers.add("Content-Type", "application/json"); 
62
09 авг. Resposta dada por Alexander Burakevych 09 ago. 2013-08-09 13:49 '13 às 13:49 2013-08-09 13:49

No Spring , você tem um tipo específico: MediaType.APPLICATION_JSON_VALUE , que é equivalente a application / json.

55
29 июня '13 в 11:34 2013-06-29 11:34 a resposta é dada por Chand Priyankara em 29 de junho '13 às 11:34 2013-06-29 11:34

application/json funciona bem no PHP para armazenar uma matriz ou objeto de dados.

Eu uso este código para colocar dados em JSON no Google Cloud Storage (GCS) , que está disponível publicamente para visualização :

 $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 devolver dados diretamente:

 $data = json_decode(file_get_contents("gs://BUCKETNAME/FILENAME.json")); 
55
01 апр. A resposta é dada Chetabahana 01 abr. 2015-04-01 19:13 '15 às 19:13 2015-04-01 19:13

Para JSON eu uso:

  Content-Type: application/json 

Isso é descrito na cláusula IETF JSON Data Interchange Format 7158, Seção 1.2: especificações JSON .

47
06 февр. A resposta é dada por Mehmet_ 06 fev. 2015-02-06 15:01 '15 às 15:01 2015-02-06 15:01

Se o JSON estiver preenchido, será application/jsonp . Se o JSON não tiver um add-on, ele será application/json .

Para lidar com eles, recomenda-se usar: "application / javascript", sem se preocupar se é com ou sem preenchimento.

47
21 июня '13 в 18:22 2013-06-21 18:22 a resposta é dada por Ankit Zalani em 21 de junho de 2013 às 6:22 2013-06-21 18:22

Expansão de respostas recebidas quando você usa o JSON no contexto do REST ...

Há um forte argumento forte sobre o uso de application/x-resource+json e application/x-collection+json quando você está apresentando recursos e coleções REST.

E se você decidir seguir a especificação jsonapi , você deve usar application/vnd.api+json conforme documentado.

Embora não haja um padrão universal, fica claro que a semântica adicionada dos recursos transferidos justifica um tipo de conteúdo mais explícito do que apenas application/json .

Seguindo essas considerações, outros contextos podem justificar um tipo de conteúdo mais específico.

40
09 июня '15 в 22:12 2015-06-09 22:12 a resposta é dada jgomo3 09 de junho de '15 às 10:12 pm 2015-06-09 22:12

Desenvolvedores PHP usam isso:

 <?php header("Content-type: application/json"); // Do something here... ?> 
39
29 марта '14 в 8:43 2014-03-29 08:43 a resposta é dada por user3087089 março 29 '14 às 8:43 2014-03-29 08:43

Se você obtiver os dados da API REST em JSON, precisará usar 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
11 апр. Resposta dada por Krishna em 11 de abr 2016-04-11 12:15 '16 às 12:15 2016-04-11 12:15

JSON (JavaScript Object Designation) e JSONP ("JSON com padding") parecem ser muito semelhantes e, portanto, pode ser muito confuso que tipo de MIME eles devem usar. Embora os formatos pareçam ser muito semelhantes, existem algumas diferenças sutis entre eles.

Portanto, sempre que duvido, tenho uma abordagem muito simples (que funciona bem na maioria dos casos), ou seja, vá e verifique o documento RFC correspondente.

JSON RFC 4627 (tipo de aplicativo / json mídia para designar objetos JavaScript (JSON)) é uma especificação de formato JSON. Seção 6 indica que o tipo de multimídia MIME para texto JSON

 application/json. 

JSONP JSONP ("JSON com complemento") é processado de maneira diferente de JSON no navegador. JSONP é tratado como um script JavaScript regular e, portanto, deve usar application/javascript, tipo MIME oficial atual para JavaScript. Em muitos casos, no entanto, o tipo MIME de text/javascript funcionará bem.

Observe que o text/javascript está marcado como desatualizado RFC 4329 (Tipos de mídia de script) e é recomendável usar o application/javascript . No entanto, devido a razões herdadas, o text/javascript ainda é amplamente utilizado e suporta cross-browser (que nem sempre é o tipo de application/javascript MIME application/javascript , especialmente em navegadores mais antigos).

23
15 февр. resposta dada por Iresha Rubasinghe em 15 de fevereiro 2016-02-15 06:20 '16 às 6:20 2016-02-15 06:20

Content-Type: application/json - JSON
Content-Type: application/javascript - json-P
Content-Type: application/x-javascript - javascript
Content-Type: text/javascript - javascript, MAS desatualizado, versões mais antigas do IE, costumavam ser usadas como o atributo html.
Content-Type: text/x-javascript - Tipos de Multimídia em JavaScript MAS Obsoleto
Content-Type: text/x-json -json antes do registro oficial do requerimento / json.

22

Outras perguntas sobre tags de or Faça uma pergunta