2009-04-29 14 views
25

Ho appena sentito parlare di JSON (JavaScript Object Notation). Qualcuno può spiegare perché è considerato (da alcuni siti Web/blog/etc) di essere importante? Abbiamo già XML, perché è meglio JSON (a parte essere "nativi di Javascript")?Perché JSON è importante?

Modifica: Hmm, il tema della risposta principale sembra essere "è più piccolo". Tuttavia, il fatto che consenta il recupero dei dati tra domini, mi sembra importante. O questo in pratica non è (ancora) molto usato?

+8

ho sentito che stavano per rinominare XML per OEML (Over Engineered Markup Language) –

+2

come si comporta JSON diverse codifiche dei caratteri (come XML fa). Esiste una codifica di caratteri implicita in una rappresentazione JSON? –

+1

Consentire ai dati di essere recuperati da un altro dominio non è una caratteristica intrinseca ai formati XML o JSON * *. È una cosa relativa al browser. –

risposta

0

Non è che sia meglio, ma che può legare molte cose insieme per consentire il trasferimento dati senza l'analisi manuale!

Per esempio javascript -> Servizio # web C -> javascript

+0

Non penso che valga come argomento considerando che anche in JavaScript spesso il JSON non è valutato ma analizzato per ragioni di sicurezza. –

+0

@Benedikt Eger - C'è un nuovo sostituto per l'eval che valuterà JSON senza i rischi di valutazione. Inoltre, se il JSON proviene da una fonte attendibile, sarà normalmente valutato. – stevehipwell

13

JSON è generalmente molto più piccolo rispetto al suo equivalente XML. Trasferimento più piccolo significa trasferimento più veloce, che si traduce in una migliore esperienza utente.

+0

Non sono d'accordo sul fatto che JSON sia più piccolo. '' è il formato XML compatto. 44 caratteri. Il json compatto è: '{persona: {" nome ":" John Doe "," tag ": [" amico "," maschio "]}}' 52 caratteri. C'è una differenza del 25%, a favore di XML. XML * può * essere più grande, ma non è necessario. – Cheeso

+4

Sono d'accordo, quindi il mio uso della parola "generalmente". Una volta che hai matrici di elementi complessi, XML diventa più grande di JSON. Sicuramente la tua lettura errata della parola "in generale" non vale un downvote? –

+1

Il JSON compatto non è corretto, dovrebbe essere "{" name ":" John Doe "," tag ": [" friend "," male "]}'. Questo lo rende 45 caratteri, che è ancora più grande dell'XML ma solo di 1 carattere. –

4
+0

Dal secondo link "Se i dati sono formattati come XML, Ajax si limita a recuperare i dati dallo stesso dominio (sito Web) da cui proviene l'applicazione Ajax. Se i dati sono formattati come JSON, Ajax può viaggiare attraverso i domini" Non è giusto, vero? –

+0

Brian, penso che tu abbia ragione. Suggerire che il secondo link sia considerato sospetto - sembra che risponda alla domanda nella sua missione anche se non riesce a raggiungerlo in alcuni punti. –

+0

@ Sam. Giusto. Grazie. –

19

XML ha diversi svantaggi:

  • È pesante!
  • Fornisce una rappresentazione gerarchica di contenuto che non è esattamente uguale a (ma molto simile a) modello di oggetti Javascript.
  • Javascript è disponibile ovunque. Senza alcun parser esterno, puoi elaborare JSON direttamente con l'interprete JS.

Chiaramente non è pensato per sostituire completamente XML. Per le app Web basate su JS, i suoi vantaggi possono essere utili.

+1

Cosa intendi con "Javascript è disponibile ovunque"? Se interfaccia la mia applicazione Java a un'istanza CouchDb, dispongo di parser XML disponibili nativamente, ma non di parser Javascript. –

+1

Ovunque in questo senso significa "su ogni computer (con un browser moderno)". –

+0

@Rabarberski: Essere lo stesso identico modello di oggetti è anche un enorme vantaggio che a volte potrebbe essere sottovalutato. –

12

JSON è molto più conciso. XML:

<person> 
    <name>John Doe</name> 
    <tags> 
     <tag>friend</tag> 
     <tag>male</tag> 
    </tags> 
</person> 

JSON:

{"name": "John Doe", "tags": ["friend", "male"]} 

C'è meno funzioni si sovrappongono, anche. Ad esempio, in XML c'è tensione tra la scelta di utilizzare gli elementi (come sopra), rispetto agli attributi (<person name="John Doe">).

+9

In realtà trovo che l'XML sia molto più facile da leggere. –

+0

Ignorando spazi bianchi estranei, si tratta di circa 44 caratteri contro 78 ma si ricorda che ogni singolo elemento figlio come nome può essere sostituito con un attributo (salvando un altro 7 o più caratteri). – cletus

+4

@Steve, da quando la leggibilità era importante sui formati di interscambio dati? – James

1

JSON è un modo per serializzare i dati negli oggetti Javascript. La sintassi è presa dal linguaggio, quindi dovrebbe essere familiare allo sviluppatore che si occupa di Javascript, e - essendo la stringificazione di un oggetto - è un metodo di serializzazione più naturale per l'interazione all'interno del browser rispetto a un derivato XML completo (con tutte le decisioni arbitrarie di progettazione che implicano).

È leggero e intuitivo.

11

JSON è diventato di uso comune principalmente perché offre un modo per aggirare la politica di origine identica utilizzata nei browser Web e quindi consentire i mashup.

Diciamo che stai scrivendo un servizio Web sul dominio A.Non è possibile caricare i dati XML dal dominio B e analizzarli perché l'unico modo per farlo sarebbe XMLHttpRequest e XMLHttpRequest era inizialmente limitato dalla politica della stessa origine per parlare solo agli URL nello stesso dominio della pagina contenente.

Si scopre che per una serie di motivi, che si sta autorizzati a richiedere <sceneggiatura> tag attraverso origini. Le persone intelligenti hanno capito che questo era un buon modo per aggirare la limitazione con XMLHttpRequest. Invece del ritorno XML del server, può restituire una serie di oggetti JavaScript e letterali di array.

(domanda bonus lasciato come esercizio al lettore: perché è < script src = "..." > consentito tra domini senza server di opt-in, ma non è XHR)

Naturalmente, tornando uno script < che consiste di nient'altro che i letterali degli oggetti non è utile perché senza assegnare i valori a qualche variabile, non si può fare nulla con esso. Pertanto, la maggior parte dei servizi utilizza una variante di JSON, denominata JSONP (http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/).

Con l'aumento della popolarità dei mashup, la gente si è resa conto che JSON era un formato di interscambio dati conveniente in generale, specialmente quando JavaScript è una delle estremità del canale. Ad esempio, JSON è ampiamente utilizzato in Chromium, anche nei casi in cui C++ è su entrambi i lati. È semplicemente un modo leggero per rappresentare dati semplici, che esistono buoni parser in molte lingue.

In modo divertente, utilizzare i tag > per creare i mashup degli script è incredibilmente insicuro perché è essenzialmente l'XSS di te stesso apposta. È stato quindi necessario introdurre JSON nativo (http://ejohn.org/blog/native-json-support-is-required/), che ovvia ai vantaggi originali del formato. Ma a quel tempo, era già super popolare :)

+0

Non capisco questa storia di origine. È banale scrivere una funzione JavaScript che restituisce un documento XML (non analizzato). È possibile utilizzare questo trucco per fornire XML con la stessa facilità con cui lo si utilizza per fornire un formato di serializzazione completamente nuovo. –

+0

È vero, si potrebbe semplicemente restituire una stringa di XML e quindi analizzarla. Ma la stringa dovrebbe essere attentamente salvata all'interno di una stringa JavaScript. Le persone si sono trovate a generare dinamicamente: returnData ("< data foo = \" bar \ "> ...</foo > ") ... e chiedersi perché preoccuparsi quando potrebbero semplicemente restituire gli oggetti e gli array direttamente. E una volta che si va su questa strada, ci si rende conto che lavorare con gli oggetti nativi e array senza fase di parse separata è un'idea migliore in generale, ma penso che i mashup siano il modo in cui JSON è stato avviato, o almeno uno di un paio di ragioni principali. –

2

Dipende da cosa stai per fare. Qui ci sono molte risposte che preferiscono JSON su XML. Se guardi più a fondo non c'è una grande differenza.

Se si dispone di un albero di oggetti, viene restituito solo un albero di oggetti javascript. Se dai un'occhiata alla tensione per usare l'accesso in stile OOP piuttosto che ritorti su di te. Supponi di avere un oggetto di tipo A, B, C costruito in un albero. Puoi facilmente abilitarli a essere serializzati su JSON. Se li leggi di nuovo, ottieni solo un albero di oggetti javascript. Per ricostruire i tuoi A, B, C devi inserire manualmente i valori in oggetti creati manualmente o facendo alcuni hack. Sembra analizzare l'XML e creare oggetti? Bene, sì :)

In questi giorni solo i browser più recenti sono dotati di supporto nativo per JSON. Per supportare più browser hai due opzioni: a) si carica un json paraser in javascript che ti aiuta ad analizzare. Quindi, quanto è grasso questo per quanto riguarda la mancanza di grasso? L'altra opzione, come vedo spesso, è la valutazione. Puoi semplicemente fare eval() su una stringa JSON per ottenere gli oggetti. Ma questo introduce una nuova serie di problemi di sicurezza. JSON è specificato in modo che non possa contenere funzioni. Se non stai controllando gli oggetti per la funzione, qualcuno può facilmente inviarti il ​​codice che viene eseguito.

Quindi potrebbe dipendere da quello che ti piace di più: JSON o XML. La più grande differenza è probabilmente il modo di accedere alle cose, sia che si tratti di tag XMLHTTPRequest ... Deciderei su cosa usare. Secondo me, se ci fosse un supporto adeguato per XPATH nei browser, spesso decido che XML lo usi. Ma la moda è diretta verso json e il caricamento di parser json aggiuntivi in ​​javascript.

Se non riesci a decidere e sai che hai bisogno di qualcosa di veramente potente, devi dare un'occhiata a YAML. Leggere di YAML è molto interessante per avere più informazioni sull'argomento. Ma dipende davvero da cosa stai cercando di fare.

1

JSON è un formato di serializzazione di oggetti basato su testo che è più leggero di XML e che si integra direttamente con il modello a oggetti di JavaScript. Questa è la maggior parte dei suoi vantaggi proprio lì.

I suoi svantaggi (rispetto all'XML) sono, approssimativamente: pochi strumenti disponibili (dimenticate la convalida e/o la conversione standard, per non parlare dell'evidenziazione della sintassi o del controllo di buona forma nella maggior parte degli editor), con minore probabilità di essere umano- leggibile (ci sono enormi variazioni nella leggibilità sia di JSON che di XML, quindi questa è un'affermazione necessariamente indistinta), l'integrazione stretta con JavaScript rende l'integrazione non troppo stretta con altri ambienti.

5

Se si lavora in Javascript, è molto più facile per noi JSON. Questo perché JSON può essere valutato direttamente in un oggetto Javascript, che è molto più facile da gestire rispetto al DOM.

di assunzione e leggermente alterando il codice XML e JSON dall'alto

XML: 

<person> 
    <name>John Doe</name> 
    <tag>friend</tag> 
    <tag>male</tag> 
</person> 

JSON: 

{ person: {"name": "John Doe", "tag": ["friend", "male"]} } 

Se si voleva ottenere il secondo oggetto tag con XML, avresti bisogno di utilizzare le potenti ma verbose API DOM:

var tag2=xmlObj.getElementsByTagName("person")[0].getElementsByTagName("tag")[1]; 

considerando che con un oggetto JavaScript che è venuto in via JSON, si può semplicemente utilizzare:

var tag2=jsonObj.person.tag[1]; 

Naturalmente, Jquery fa l'esempio DOM molto più semplice:

var tag2=$("person tag",xmlObj).get(1); 

Tuttavia, JSON solo "si adatta" in un mondo Javascript. Se lavori per un po ', scoprirai di avere un sovraccarico mentale molto inferiore rispetto al coinvolgimento di dati basati su XML.

Tutti gli esempi precedenti ignorano la possibilità che uno o più nodi siano disponibili, duplicati o che il nodo abbia solo uno o nessun figlio. Tuttavia, per illustrare il nativo-ness di JSON, per fare questo con l'jsonObj, che ci resta che:

var tag2=(jsonObj.person && jsonObj.person.tags && jsonObj.person.tags.sort && jsonObj.person.tags.length==2 ? jsonObj.person.tags[1] : null); 

(alcune persone potrebbero non piace che a lungo di ternaria, ma funziona). Ma XML sarebbe (a mio avviso) più cattivo (non credo che tu voglia seguire l'approccio ternario perché continueresti a chiamare i metodi dom che potrebbero dover ripetere il lavoro a seconda dell'implementazione):

var tag2=null; 
var persons=xmlObj.getElementsByTagName("person"); 
if(persons.length==1) { 
    var tags=persons[0].getElementsByTagName("tag"); 
    if(tags.length==2) { tag2=tags[1]; } 
} 

Jquery (non testata):

var tag2=$("person:only-child tag:nth-child(1)",xmlObj).get(0); 
Problemi correlati