Quali sono le differenze tra JSON e JSONP?


393

Formato saggio, tipo di file saggio e uso pratico saggio?



1
Grazie per il link, ci sono alcune informazioni davvero buone lì.
Mohammad,

4
Un metodo è più veloce dell'altro? Ad esempio, se usi XMLHttpRequest per OTTENERE una richiesta (ovviamente allo stesso dominio poiché è ajax "normale") o se usi il metodo JSONP (che non utilizzerà XMLHTTPRequest) - uno sarà più veloce dell'altro? So che dipende da diversi fattori - ma qualcuno ha fatto confronti di velocità?
Yuval A.

Risposte:


405

JSONP è JSON con imbottitura. Cioè, hai messo una stringa all'inizio e un paio di parentesi attorno ad essa. Per esempio:

//JSON
{"name":"stackoverflow","id":5}
//JSONP
func({"name":"stackoverflow","id":5});

Il risultato è che è possibile caricare JSON come file di script. Se in precedenza hai impostato una funzione chiamata func, tale funzione verrà chiamata con un argomento, ovvero i dati JSON, al termine del caricamento del file di script. Di solito viene utilizzato per consentire AJAX tra siti con dati JSON. Se sai che example.com sta offrendo file JSON che assomigliano all'esempio JSONP sopra indicato, allora puoi usare codice come questo per recuperarlo, anche se non sei nel dominio example.com:

function func(json){
  alert(json.name);
}
var elm = document.createElement("script");
elm.setAttribute("type", "text/javascript");
elm.src = "http://example.com/jsonp";
document.body.appendChild(elm);

3
C'è ancora un punto in cui JSONP suppone che sia possibile configurare CORS per consentire le richieste di origine incrociata?
1919

Forse un po 'in ritardo ma comunque voglio dare una risposta alla tua domanda per gli altri, No, se usi JSONP hai eliminato tutti i vantaggi CORS (ho chiamato vantaggio a causa del problema di sicurezza.) Ti consiglio di implementare CORS correttamente, Questo ti aiuterà su problemi di sicurezza e anche un migliore approccio all'architettura.
Dogan,

101

Fondamentalmente, non sei autorizzato a richiedere dati JSON da un altro dominio tramite AJAX a causa della stessa politica di origine. AJAX consente di recuperare i dati dopo che una pagina è già stata caricata, quindi eseguire un codice / chiamare una funzione una volta restituita. Non possiamo usare AJAX ma ci è permesso iniettare <script>tag nella nostra pagina e quelli possono fare riferimento a script ospitati su altri domini.

Di solito lo useresti per includere librerie da un CDN come jQuery . Tuttavia, possiamo abusare di questo e usarlo per recuperare i dati! JSON è già valido JavaScript ( per la maggior parte ), ma non possiamo semplicemente restituire JSON nel nostro file di script, perché non abbiamo modo di sapere quando lo script / dati ha terminato il caricamento e non abbiamo modo di accedervi a meno che non sia assegnato a una variabile o passato a una funzione. Quindi quello che facciamo invece è dire al servizio web di chiamare una funzione per nostro conto quando è pronto.

Ad esempio, potremmo richiedere alcuni dati da un'API di borsa e, insieme ai nostri soliti parametri API, diamo una richiamata, come ?callback=callThisWhenReady. Il servizio web avvolge poi i dati con la nostra funzione e lo restituisce in questo modo: callThisWhenReady({...data...}). Ora non appena lo script viene caricato, il browser tenterà di eseguirlo (come di consueto), che a sua volta chiama la nostra funzione arbitraria e ci fornisce i dati desiderati.

Funziona in modo molto simile a una normale richiesta AJAX tranne per il fatto che invece di chiamare una funzione anonima, dobbiamo usare le funzioni denominate.

jQuery in realtà supporta questo per te senza soluzione di continuità creando una funzione con un nome univoco per te e spegnendola, che a sua volta eseguirà il codice desiderato.


2
Separato da cosa?
Neanche

6
@nickf: Sì ... stavo cercando la parola giusta ... come la chiameresti allora? "formato di scambio dati" secondo json.org.
mpen

o più leggibile: JSON: un oggetto javascript in "notazione testuale". Come faresti a String () un oggetto Java forse?
Sam Vloeberghs,

FWIW: @SamVloeberghs - È un po 'fuorviante dire che JSON rappresenta un oggetto javascript. Potrebbe essere qualsiasi dato, proveniente da qualsiasi lingua o database, rappresentabile come coppie nome-valore e array. E sono necessarie ulteriori convenzioni per il round trip accurato di qualsiasi oggetto JS - vedi JSON: tipi di dati nativi non supportati . In particolare, JS Date ritorna all'estremità come una stringa. weblog.west-wind.com/posts/2014/jan/06/…
ToolmakerSteve

66

JSONP consente di specificare una funzione di callback a cui viene passato l'oggetto JSON. Ciò consente di ignorare la stessa politica di origine e caricare JSON da un server esterno nel JavaScript sulla pagina Web.


30

JSONP sta per "JSON con padding" ed è una soluzione alternativa per il caricamento di dati da domini diversi. Carica lo script nell'intestazione del DOM e quindi puoi accedere alle informazioni come se fossero caricate sul tuo dominio, evitando così il problema tra domini.

jsonCallback(
{
    "sites":
    [
        {
            "siteName": "JQUERY4U",
            "domainName": "http://www.jquery4u.com",
            "description": "#1 jQuery Blog for your Daily News, Plugins, Tuts/Tips &amp; Code Snippets."
        },
        {
            "siteName": "BLOGOOLA",
            "domainName": "http://www.blogoola.com",
            "description": "Expose your blog to millions and increase your audience."
        },
        {
            "siteName": "PHPSCRIPTS4U",
            "domainName": "http://www.phpscripts4u.com",
            "description": "The Blog of Enthusiastic PHP Scripters"
        }
    ]
});

(function($) {
var url = 'http://www.jquery4u.com/scripts/jquery4u-sites.json?callback=?';

$.ajax({
   type: 'GET',
    url: url,
    async: false,
    jsonpCallback: 'jsonCallback',
    contentType: "application/json",
    dataType: 'jsonp',
    success: function(json) {
       console.dir(json.sites);
    },
    error: function(e) {
       console.log(e.message);
    }
});

})(jQuery);

Ora possiamo richiedere JSON tramite AJAX utilizzando JSONP e la funzione di callback che abbiamo creato attorno al contenuto JSON. L'output dovrebbe essere JSON come oggetto che possiamo quindi utilizzare i dati per ciò che vogliamo senza restrizioni.


18

JSONP è essenzialmente, JSON con codice aggiuntivo, come una chiamata di funzione racchiusa tra i dati. Permette di agire sui dati durante l'analisi.


13

JSON

JSON (JavaScript Object Notation) è un modo conveniente per trasportare dati tra applicazioni, specialmente quando la destinazione è un'applicazione JavaScript.

Esempio:

Ecco un esempio minimo che utilizza JSON come trasporto per la risposta del server. Il client effettua una richiesta Ajax con la funzione abbreviata jQuery $ .getJSON. Il server genera un hash, lo formatta come JSON e lo restituisce al client. Il client lo formatta e lo inserisce in un elemento di pagina.

Server:

get '/json' do
 content_type :json
 content = { :response  => 'Sent via JSON',
            :timestamp => Time.now,
            :random    => rand(10000) }
 content.to_json
end

Cliente:

var url = host_prefix + '/json';
$.getJSON(url, function(json){
  $("#json-response").html(JSON.stringify(json, null, 2));
});

Produzione:

  {
   "response": "Sent via JSON",
   "timestamp": "2014-06-18 09:49:01 +0000",
   "random": 6074
  }

JSONP (JSON con imbottitura)

JSONP è un modo semplice per superare le restrizioni del browser quando si inviano risposte JSON da domini diversi dal client.

L'unica modifica sul lato client con JSONP è l'aggiunta di un parametro di callback all'URL

Server:

get '/jsonp' do
 callback = params['callback']
 content_type :js
 content = { :response  => 'Sent via JSONP',
            :timestamp => Time.now,
            :random    => rand(10000) }
 "#{callback}(#{content.to_json})"
end

Cliente:

var url = host_prefix + '/jsonp?callback=?';
$.getJSON(url, function(jsonp){
  $("#jsonp-response").html(JSON.stringify(jsonp, null, 2));
});

Produzione:

 {
  "response": "Sent via JSONP",
  "timestamp": "2014-06-18 09:50:15 +0000",
  "random": 364
}

Link: http://www.codingslover.blogspot.in/2014/11/what-are-differences-between-json-and-jsonp.html


6

"JSONP è JSON con codice aggiuntivo" sarebbe troppo facile per il mondo reale. No, devi avere piccole discrepanze. Qual è il divertimento nella programmazione se tutto funziona ?

Si scopre che JSON non è un sottoinsieme di JavaScript . Se tutto ciò che fai è prendere un oggetto JSON e inserirlo in una chiamata di funzione, un giorno verrai morso da strani errori di sintassi, come lo ero oggi.


0

JSONP è un modo semplice per superare le restrizioni del browser quando si inviano risposte JSON da domini diversi dal client.

Ma l'implementazione pratica dell'approccio implica sottili differenze che spesso non sono spiegate chiaramente.

Ecco un semplice tutorial che mostra JSON e JSONP fianco a fianco.

Tutto il codice è disponibile gratuitamente su Github e una versione live è disponibile su http://json-jsonp-tutorial.craic.com

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.