Qual è il tipo di contenuto JSON corretto?

Ho pasticciato con JSON per qualche tempo, semplicemente spingendolo fuori come testo e non ha fatto male a nessuno (che io sappia), ma mi piacerebbe iniziare a fare le cose correttamente.

Ho visto così tanti presunti "standard" per il tipo di contenuto JSON:

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

Ma qual è quello corretto, o il migliore? Ho capito che ci sono problemi di sicurezza e di supporto dei browser che variano tra loro.

So che c'è una domanda simile, Quale tipo di MIME se JSON viene restituito da un'API REST?, ma vorrei una risposta leggermente più mirata.

Soluzione

Per il testo JSON:

application/json

Il tipo di media MIME per il testo JSON è application/json. La codifica predefinita è UTF-8. (Fonte: RFC 4627).

Per JSONP (javascript eseguibile) con callback:

application/javascript

Qui ci sono alcuni post del blog che sono stati menzionati nei commenti che sono rilevanti.

Commentari (8)

Naturalmente, il tipo di media MIME corretto per JSON è application/json, ma è necessario capire quale tipo di dati è previsto nella tua applicazione.

Per esempio, io uso Ext GWT e la risposta del server deve andare come text/html ma contiene dati JSON.

Lato client, ascoltatore di moduli 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");
    }
});

In caso di utilizzo del tipo di risposta application/json, il browser mi suggerisce di salvare il file.

Snippet di codice sorgente lato server 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);
    }
};
Commentari (1)

Se stai chiamando ASP.NET Web Services dal lato client devi usare application/json per farlo funzionare. Credo che questo sia lo stesso per i framework jQuery e Ext.

Commentari (2)