Qual é o tipo de conteúdo JSON correto?

10255

Estou brincando com o JSON há algum tempo, apenas enviando-o como texto e não machucou ninguém (que eu saiba), mas eu gostaria de começar a fazer as coisas corretamente.

Eu vi assim que muitos "padrões" supostamente para o tipo de conteúdo JSON:

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

Mas qual é a correta ou melhor? Entendo que há problemas de segurança e suporte ao navegador que variam entre eles.

Sei que há uma pergunta semelhante: que tipo MIME se JSON está sendo retornado por uma API REST? , mas eu gostaria de uma resposta um pouco mais direcionada.

Oli
fonte

Respostas:

10310

Para texto JSON:

application/json

O tipo de mídia MIME para o 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 algumas postagens do blog que foram mencionadas nos comentários relevantes.

quiabo
fonte
47
Lista completa de tipos MIME
Eugen Mihailescu 04/04
Posso enviar arquivos Json texto juntos?
OPV 23/07
7
Internet Explorer às vezes tem problemas com application / json - blog está offline
kudlatiger
6
Imagine que eu tenho um documento escrito por alguém que contém texto sem formatação. Agora, esse texto simples também é JSON válido. Eu estaria errado em usar texto / simples como seu tipo MIME? JSON é um SUB-TIPO de texto. Então eu acho que ambos devem ser permitidos. A questão é qual funciona melhor na prática. De acordo com o comentário de codetoshare, o IE tem problemas com application / json. Mas nenhum navegador deve ter problemas com texto / sem formatação. Se texto / simples não for seguro, como posso enviar arquivos de texto do meu site?
Panu Logic
5
@EugenMihailescu O título dessa página é "Lista incompleta de tipos MIME"
Omegastick 30/08/19
1617

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

Quando perguntado por que não text/json, Crockford parece ter dito que o JSON não é realmente JavaScript nem texto, e que a IANA tem maior probabilidade de distribuir do application/*que text/*.

Mais recursos:

gnrfan
fonte
166
Muitas coisas foram colocadas na text/*seção nos primeiros dias que provavelmente seriam colocadas na application/*seção atualmente.
TRIG
29
@Rohmer - Você "pode" abrir qualquer coisa em um editor de texto, mas um formato binário como JPEG ou Windows .exe ou .zip conterá caracteres não imprimíveis que podem realmente quebrar muitos editores de texto ou causar comportamentos indesejados. Tente executar, cat file.jpgpor exemplo. Considerando que qualquer arquivo xml ou json é 100% imprimível. Então, acho que o argumento de Stijn de Witt é válido, apesar do fato de que sim, é tarde demais para mudar agora.
XP84 16/01/19
4
@ XP84 Pode abrir qualquer binário com um editor de texto no formato HEX. E todos os caracteres diferentes (os 16) são 100% imprimíveis. Então, por essa lógica ... todos os binários são textos? Json não é texto. JSON é (aviso: informal frente definição solta) uma representação de texto de um objeto (ou matriz de objetos)
xDaizu
5
Não há significado para a frase "um editor de texto no formato HEX". Um editor Hex mostra cada byte como seu valor hexadecimal, por exemplo, o byte 1111000 como "78". Embora possa haver alguns editores de texto que também possuam um modo de edição hexadecimal, isso não é comum nem útil para nada além dos usuários mais técnicos que executam as tarefas mais técnicas. O texto, por comparação, significa ASCII ou Unicode e, no texto, o byte 1111000 significa xcaracteres minúsculos . Não 78. JSON é texto exatamente da mesma maneira que HTML (text / html). Ele contém apenas caracteres de texto legíveis, com significado estruturado neles.
XP84
11
Tendo a concordar com Stijn de Witt. JSON deve ser visualizado e editado com um editor de texto.
Panu Logic
891

Para JSON:

Content-Type: application/json

Para JSON-P :

Content-Type: application/javascript
Alix Axel
fonte
62
JSONP não é realmente JSON, porém, é uma técnica para passar um objeto literal JavaScript
Benjamin Gruenbaum
632

Obviamente, o tipo de mídia MIME correto para JSON é application/json, mas é necessário perceber que tipo de dados é esperado em seu aplicativo.

Por exemplo, eu uso o Ext GWT e a resposta do servidor deve ser em texto / html, mas contém dados JSON.

Lado do cliente, ouvinte de formulário 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");
    }
});

No caso de usar o tipo de resposta application / json , o navegador sugere que eu salve o arquivo.

Fragmento de código-fonte do servidor usando o 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
fonte
7
a resposta do servidor deve ir como texto / html. Isso também vale para a variante ExtJS.
gbegley
463

JSON:

A resposta são dados gerados dinamicamente, de acordo com os parâmetros de consulta passados ​​no URL.

Exemplo:

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

Tipo de conteúdo: application/json


JSON-P:

JSON com preenchimento. A resposta são dados JSON, com uma chamada de função envolvida.

Exemplo:

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

Tipo de conteúdo: application/javascript

Bhavin
fonte
46
A definição de JSON está errada. Ele não precisa ser gerado dinamicamente ou respeitar os parâmetros de consulta. Você pode servir um arquivo JSON estático. Além disso, a resposta mais votada possui um link para o RFC.
styfle
10
Também JSONP pode ser dados json atribuídos a uma var.
Jimmy Kane
401

Se você estiver usando o Ubuntu ou o Debian e forneça arquivos .json através do Apache, convém servir os arquivos com o tipo de conteúdo correto. Estou fazendo isso principalmente porque quero usar a extensão JSONView do Firefox

O módulo Apache mod_mime ajudará a fazer isso facilmente. No entanto, com o Ubuntu, você precisa editar o arquivo /etc/mime.types e adicionar a linha

application/json json

Em seguida, reinicie o Apache:

sudo service apache2 restart
Gourneau
fonte
44
geralmente uma recarga é suficiente (mais rápido que reiniciar). Além disso, observe que agora você pode executar o "sudo service apache2 reload".
noamtm
19
O Ubuntu 12.04 tem isso por padrão
Prizoff 25/05
386

Se você estiver chamando o ASP.NET Web Services do lado do cliente, precisará usar application/jsonpara que ele funcione. Eu acredito que isso é o mesmo para as estruturas jQuery e Ext .

markvpc
fonte
20
O jQuery parece funcionar com pelo menos 'application / json' e 'text / plain' ... Ainda não tentei todos os outros.
Nathan
jQuery é capaz de trabalhar com 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

O tipo de conteúdo certo para JSON é, a application/jsonmenos que você esteja usando JSONP , também conhecido como JSON com preenchimento, que na verdade é JavaScript e, portanto, seria o tipo de conteúdo certo application/javascript.

Resist Design
fonte
296

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 que usar application/x-javascriptdevido a alguns problemas de compactação. Meu ambiente de hospedagem é uma hospedagem compartilhada com o GoDaddy . Eles não me permitem alterar as configurações do servidor. Eu adicionei o seguinte código ao meu web.configarquivo para compactar 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"/>

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

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

nas seções de tipos estático e dinâmico. Mas isso não compacta as respostas JSON.

Depois disso, removi esse tipo recém-adicionado e adicionei

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

nas seções de tipos estático e dinâmico e alterou o tipo de resposta em

.ashx (manipulador assíncrono) para

application/x-javascript

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

application/x-javascript

somente se você deseja compactar suas respostas JSON em um ambiente de hospedagem compartilhado . Como na hospedagem compartilhada, eles não permitem alterar as configurações do IIS .

shashwat
fonte
11
"Então, eu pessoalmente recomendo usar application / x-javascript" é onde essa resposta se torna enganosa. GoDaddy não permitem compressão application/json, eu aproveitá-lo na minha hospedagem compartilhada e eu não iria sugerir o uso de um tipo de conteúdo diferente para ativar a compactação de qualquer maneira, é simplesmente errado. Isso pode ser feito, mas ainda estará errado. O uso de diferentes tipos de conteúdo para suporte ao navegador é uma coisa, o uso de diferentes tipos de conteúdo para compactação no servidor.
269

Somente ao usar application/jsoncomo o tipo MIME , tenho o seguinte (a partir de novembro de 2011 com as versões mais recentes do Chrome, Firefox com Firebug ):

  • Não há mais avisos do Chrome quando o JSON é carregado no servidor.
  • O Firebug adicionará uma guia à resposta, mostrando os dados JSON formatados. Se o tipo MIME for diferente, ele aparecerá como 'Conteúdo da resposta'.
Ivo Limmen
fonte
244

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

Se você estiver usando o envio de formulário Ext JS para fazer upload do arquivo, esteja ciente de que a resposta do servidor é analisada pelo navegador para criar o documento para <iframe>.

Se o servidor estiver usando JSON para enviar o objeto de retorno, o Content-Typecabeçalho deverá ser definido comotext/html solicitar ao navegador que insira o texto inalterado no corpo do documento.

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

Conan
fonte
40
Ferramentas que não aderem aos padrões devem ser evitadas sempre que possível; use application/jsonpor especificação.
one.beat.consumer
15
@ one.beat.consumer, enquanto isso é verdade, não é específico para ExtJs em si. É uma limitação do navegador (ou melhor, talvez, uma "medida de segurança").
Hendy Irawan
7
Certamente, seria melhor usar texto / sem formatação para não aplicar semântica HTML ao conteúdo não HTML. Ou os navegadores não permitem extrair o conteúdo de um quadro se ele não tiver DOM?
Synchro
5
Para adicionar ainda mais confusão: Eu só estou a depuração de um caso semelhante no Samsung Galaxy Beam (Android 2.3) com o navegador padrão, eo iframeparece fogo loadevento para application/javascript, application/x-javascript, text/javascript, text/plain, mas não atirando-o para application/jsonnem text/html. Atualmente, o Android <= 2.3 representa cerca de 50% da participação no mercado do Android.
jakub.g
226

JSON é uma linguagem específica de domínio (DSL) e um formato de dados independente do JavaScript e, como tal, possui seu próprio tipo MIMEapplication/json . Obviamente, o respeito pelos tipos MIME é direcionado ao cliente, o que text/plainpode acontecer com a transferência de bytes, mas você pressionaria desnecessariamente a interpretação para o domínio do aplicativo do fornecedor - application/json. Você transfere XML via text/plain?

Mas, honestamente, sua escolha do tipo MIME é aconselhar o cliente sobre como interpretar os dados - text/plainou text/HTML(quando não é HTML) é como apagar o tipo - é tão pouco informativo quanto transformar todos os seus objetos do tipo Object em uma linguagem digitada.

Nenhum tempo de execução do navegador que eu conheça pegará um documento JSON e o disponibilizará automaticamente para o tempo de execução como um objeto acessível por JavaScript sem intervenção, mas se você estiver trabalhando com um cliente com problemas, isso é uma questão totalmente diferente. Mas essa não é a história toda - os serviços JSON RESTful geralmente não têm tempos de execução do JavaScript, mas não os impedem de usar o JSON como um formato viável de intercâmbio de dados. Se os clientes são tão aleijados ... então eu consideraria talvez a injeção de HTML por meio de um serviço de modelagem do Ajax .

Aplicação / JSON!

VLostBoy
fonte
210

Se você estiver em um ambiente do lado do cliente, é obrigatório investigar sobre o suporte a vários navegadores para um aplicativo Web bem suportado.

O tipo de conteúdo HTTP correto seria application/json, como outros já destacados, mas alguns clientes não lidam muito bem com isso, é por isso que o jQuery recomenda o padrão text/html.

Emanuele Del Grande
fonte
170

A resposta correta é:

Content-Type: application/json
Irfan DANISH
fonte
166

Como muitos outros mencionaram, application/json é a resposta correta.

Mas o que ainda não foi explicado é o que significam as outras opções que você propôs.

  • application/x-javascript: O tipo experimental MIME para JavaScript antes application/javascriptera padronizado.

  • text/javascript: Agora obsoleto. Você deve usar application/javascriptao usar javascript.

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

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

Em suma, sempre que você tiver alguma dúvida sobre os tipos de conteúdo, verifique este link

fcm
fonte
15
Quando text/javascriptficou obsoleto? Ainda estou preenchendo documentos HTML com <script type="text/javascript" ...tags.
Oli
7
Realmente não faz diferença para navegadores. É apenas obsoleto para os padrões RFC: rfc-editor.org/rfc/rfc4329.txt
FCM
16
@ Oli, você pode soltar com segurança type="text/javascript"e fazer <script>...</script>pelo menos de acordo com o HTML5.
TCB13 27/06
149

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

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

O tipo de mídia MIME correto para JSON é application/json. O JSP o utilizará para enviar uma resposta ao cliente.

rajá
fonte
115

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

O registro IANA paraapplication/json diz

Aplicativos que usam esse tipo de mídia: JSON foi usado para trocar dados entre aplicativos escritos em todas as 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 Esquema.

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

O suporte ao navegador é outra coisa.

Os tipos de mídia não padrão mais amplamente suportados são text/jsonou 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/javascriptpara algumas das suas 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


fonte
90

O tipo MIME certo é application/json

MAS

Eu experimentei muitas situações em que o tipo de navegador ou o usuário da estrutura precisava:

text/html

application/javascript
LombaX
fonte
10
Exemplo de tal situação?
Mark Amery
75

Eu uso o abaixo

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

O cabeçalho Content-Type deve ser definido como ' application / json ' ao postar. O servidor que atende a solicitação deve incluir " Accept = application / json ". No Spring MVC, você pode fazer o seguinte:

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

Adicione cabeçalhos à resposta:

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

No Spring, você tem um tipo definido: MediaType.APPLICATION_JSON_VALUEque é equivalente a application / json .

Chand Priyankara
fonte
2
Isso é Java EE também :: javax.ws.rs.core.MediaType
Eddie B
59

Os application/jsontrabalhos grandes em PHP para armazenar um array ou objeto de dados.

Eu uso esse código para colocar dados em JSON no Google Cloud Storage (GCS), definido 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 voltar, os dados são simples:

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

Se o JSON estiver com preenchimento, será application/jsonp. Se o JSON estiver sem preenchimento, seráapplication/json .

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

Ankit Zalani
fonte
8
A primeira parte da sua resposta está errada. "application / jsonp" não é um tipo MIME válido. O corpo da resposta de um JSONP é apenas JavaScript, portanto, um dos tipos MIME para JavaScript deve ser usado.
Rob W
43

Estendendo as respostas aceitas, quando você estiver usando JSON em um contexto REST ...

Há um forte argumento sobre o uso application/x-resource+jsone application/x-collection+jsonquando você está representando recursos e coleções REST.

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

Embora não haja um padrão universal, é claro que a semântica adicionada aos recursos transferidos justifica um Tipo de Conteúdo mais explícito do que apenasapplication/json .

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

jgomo3
fonte
3
application/vnd.api+jsonparece ser especificamente para apis usando json: api , uma especificação muito estreita com suas próprias expectativas e formato, não entendo que seja para qualquer API que retorne json. Por favor, corrija-me se estiver errado #
Hilikus
42

Os desenvolvedores de PHP usam isso:

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

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

Se você obtiver 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
Krishna
fonte
28

Content-Type: application/json- json
Content-Type: application/javascript- json-P
Content-Type: application/x-javascript- javascript
Content-Type: text/javascript- javascript MAS obsoletas, versões mais antigas do IE costumavam usar como atributo html.
Content-Type: text/x-javascript- Tipos de mídia JavaScript MAS obsoletos
Content-Type: text/x-json- json antes do aplicativo / json ser registrado oficialmente.

Kashif Solangi
fonte
Para texto JSON: application / json Tipo de conteúdo: application / json
Vikash Chauhan
28

Os formatos JSON (JavaScript Object Notation) e JSONP ("JSON com preenchimento") parecem ser muito semelhantes e, portanto, pode ser muito confuso qual tipo MIME eles devem usar. Mesmo que os formatos sejam semelhantes, existem algumas diferenças sutis entre eles.

Portanto, sempre que tiver alguma dúvida, tenho uma abordagem muito simples (que funciona perfeitamente bem na maioria dos casos), a saber, vá e verifique o documento RFC correspondente.

JSON RFC 4627 (O tipo de mídia application / json para JavaScript Object Notation (JSON)) é uma especificação do formato JSON. Diz na seção 6, que o tipo de mídia MIME para o texto JSON é

application/json.

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

Observe que text/javascriptfoi marcado como obsoleto pelo documento RFC 4329 (tipos de mídia de script) e é recomendável usar o application/javascripttipo. No entanto, devido a motivos herdados, text/javascriptainda é amplamente utilizado e possui suporte para vários navegadores (o que nem sempre é o caso do application/javascripttipo MIME, especialmente em navegadores mais antigos).

Iresha Rubasinghe
fonte