JSON è un formato per lo scambio dati ampiamente utilizzato e diffuso in molte applicazioni e stack tecnologici. BSON, la rappresentazione binaria di JSON, è principalmente utilizzata internamente da MongoDB per archiviare e consultare i dati in modo efficiente.
Sommario
JSON, o JavaScript Object Notation, è un formato leggibile dall'uomo per lo scambio di dati, introdotto all'inizio degli anni 2000. Anche se JSON è basato su un sottoinsieme dello standard del linguaggio di programmazione JavaScript, è completamente indipendente da esso.
Gli oggetti JSON sono container associativi, in cui una chiave di tipo stringa è mappata su un valore (che può essere un numero, una stringa, un dato booleano, un array, un valore vuoto (null) o anche un altro oggetto). Quasi tutti i linguaggi di programmazione supportano questa struttura di dati astratta: oggetti in JavaScript, dizionari in Python, tabelle hash in Java e C#, array associativi in C++ e così via.
Gli oggetti JSON sono strutturati in formati facilmente leggibili dall'uomo e dalle applicazioni.
{
"_id": 1,
"name": { "first" : "John", "last" : "Backus" },
"contribs": [ "Fortran", "ALGOL", "Backus-Naur Form", "FP" ],
"awards": [
{
"award": "W.W. McDowell Award",
"year": 1967,
"by": "IEEE Computer Society"
}, {
"award": "Draper Prize",
"year": 1993,
"by": "National Academy of Engineering"
}
]
}
Da notare che il file JSON è composto da coppie chiave-valore separate da virgole e le coppie chiave-valore sono indicate con i due punti (:). L'oggetto JSON (documento) inizia e termina con parentesi graffe. È possibile utilizzare uno qualsiasi dei tipi di dati supportati. L'esempio precedente mostra stringhe (tra virgolette), numeri e matrici (all'interno di parentesi quadre).
Quando JavaScript è diventato il linguaggio principale per lo sviluppo web, JSON ha iniziato a evolversi in modo indipendente. La versatilità di JSON, facile da leggere sia dall'uomo che dalle macchine e facile da implementare in altri linguaggi di programmazione, ha portato all'utilizzo di questo formato oltre le pagine web, in altri tipi di software.
Oggi, JSON viene utilizzato in molti casi diversi:
Fin dall'inizio, MongoDB è stato progettato per offrire un'esperienza di sviluppo ottimale. L'ubiquità di JSON lo ha reso la scelta ovvia per rappresentare le strutture dati nel data model doc di MongoDB.
È più facile creare applicazioni utilizzando stack tecnologici come MEAN e MERN, perché gli sviluppatori possono utilizzare un unico linguaggio di programmazione (JavaScript) dall'inizio alla fine.
Tuttavia, ci sono diversi problemi che rendono JSON meno adatto all'uso all'interno di un database.
JSON supporta solo un numero limitato di tipi di dati di base. In particolare, JSON non supporta i dati binari e di data e ora.
Gli oggetti e le proprietà JSON non hanno una lunghezza fissa, il che rende la consultazione dei dati più lenta.
JSON non fornisce metadati e informazioni sul tipo, richiedendo più tempo per il recupero dei documenti.
Per rendere MongoDB JSON-first ma comunque ad alte prestazioni e adatto all'uso generale, è stato creato BSON per colmare il divario: una rappresentazione binaria per archiviare i dati come documenti JSON, ottimizzata per offrire velocità, spazio ed efficienza. In termini di approccio, non è molto diverso da altri formati binari di scambio come Protocol Buffers o Thrift.
BSON sta per “Binary JSON“ ed è esattamente per questo che è stato inventato. Un file BSON è una rappresentazione binaria del file JSON corrispondente. Il formato di serializzazione binario di BSON codifica anche informazioni sul tipo e sulla lunghezza, il che consente una consultazione molto più rapida rispetto a JSON.
BSON aggiunge alcuni tipi di dati aggiuntivi (non nativi di JSON), come date e dati binari, fondamentali per MongoDB per offrire funzionalità avanzate.
Di seguito sono riportati alcuni esempi di oggetti JSON e le loro corrispondenti rappresentazioni binarie JSON.
{"hello": "world"} →
\x16\x00\x00\x00 // total document size
\x02 // 0x02 = type String
hello\x00 // field name
\x06\x00\x00\x00world\x00 // field value
\x00 // 0x00 = type EOO ('end of object')
{"BSON": ["awesome", 5.05, 1986]} →
\x31\x00\x00\x00
\x04BSON\x00
\x26\x00\x00\x00
\x02\x30\x00\x08\x00\x00\x00awesome\x00
\x01\x31\x00\x33\x33\x33\x33\x33\x33\x14\x40
\x10\x32\x00\xc2\x07\x00\x00
\x00
\x00
Per maggiori informazioni sulla sintassi di BSON, consulta la specifica BSON.
MongoDB archivia i dati in formato BSON sia internamente che attraverso la rete. Tutto ciò che può essere rappresentato in JSON può essere archiviato in modo nativo in MongoDB e recuperato facilmente in JSON.
Quando utilizzi il driver MongoDB per il tuo linguaggio di programmazione preferito, lavori con le strutture dati native di quel linguaggio. La tua applicazione deve convertire la struttura dati nativa (ad esempio, un oggetto JavaScript o POJO) in JSON. Il driver MongoDB si occupa quindi di convertire i dati da JSON a BSON e viceversa quando si interroga il database.
A differenza dei sistemi che memorizzano JSON come valori codificati in stringhe o come blob codificati in binario, MongoDB utilizza BSON per offrire potenti funzionalità di indicizzazione e query basate sul formato di dati più popolare del web.
Ad esempio, MongoDB consente agli sviluppatori di interrogare e manipolare oggetti tramite chiavi specifiche all'interno del documento JSON/BSON, anche in documenti annidati a molti livelli in profondità in un record, e creare indici ad alte prestazioni sulle stesse chiavi e valori.
In primo luogo, i file BSON possono contenere oggetti di tipo data/ora o binari che non sono rappresentabili nativamente in JSON puro.
In secondo luogo, ogni linguaggio di programmazione ha una propria semantica degli oggetti. Ad esempio, gli oggetti JSON hanno chiavi ordinate, mentre i dizionari Python (la struttura dati nativa più vicina, analoga agli oggetti JavaScript) non sono ordinate; possono inoltre entrare in gioco differenze nei tipi di dati numerici e di stringa. In terzo luogo, BSON supporta una serie di tipi numerici che non sono nativi di JSON, e molti linguaggi li rappresentano in modo diverso.
EJSON o Extended JSON è un modo compatibile con JSON per rappresentare i valori BSON in MongoDB. Poiché JSON supporta solo un sottoinsieme dei tipi supportati da BSON, MongoDB aggiunge alcune estensioni al formato JSON, ovvero la canonical mode e la relaxed mode. MongoDB fornisce metodi come serialize, deserialize, parse e stringify per EJSON.
Quando un'applicazione scrive o aggiorna i dati in MongoDB utilizzando la shell, l'API o MongoDB Atlas, i dati vengono sottoposti a parsing nel formato BSON dal driver MongoDB. Il parsing comporta l'identificazione e l'interpretazione degli oggetti JavaScript o della struttura JSON, la mappatura di ogni campo al giusto tipo di dati BSON e la conversione dei valori. Quando un'applicazione richiede dati da MongoDB, il driver converte i dati in una stringa JSON prima di inviarli tramite il server.
Consulta la documentazione del driver per capire come accedere al meglio ai dati supportati da BSON in MongoDB nel tuo linguaggio.
JSON | BSON | |
---|---|---|
Encoding | UTF-8 string | Binary |
Data Support | String, boolean, number, array, object, null | String, boolean, number (integer, float, long, decimal128...), array, null, date, BinData |
Readability | Human and machine | Machine only |
JSON e BSON hanno una concezione di base simile. BSON è progettato come una rappresentazione binaria di dati JSON, con estensioni specifiche per applicazioni più ampie e ottimizzato per lo storage e la consultazione dei dati. Proprio come JSON, BSON supporta l'incorporamento di oggetti e array.
Una differenza specifica tra BSON e JSON è nel supporto di alcuni tipi di dati più avanzati. JSON, ad esempio, non distingue tra numeri interi (che sono numeri tondi) e numeri in virgola mobile (che hanno una precisione decimale a vari livelli).
La maggior parte dei linguaggi di programmazione lato server ha tipi numerici più sofisticati (gli standard includono numeri interi, numeri in virgola mobile a precisione regolare, ovvero “float“, numeri in virgola mobile a doppia precisione, ovvero “double“ — e valori booleani), ognuno con il suo utilizzo ottimale per operazioni matematiche efficienti.
Una delle maggiori attrazioni per gli sviluppatori che utilizzano database con modelli di dati JSON e BSON è lo schema dinamico e flessibile che forniscono rispetto ai rigidi modelli di dati in formato tabellare utilizzati dai relational database.
Innanzitutto, i documenti MongoDB sono polimorfici: i campi possono variare da documento a documento all'interno di una singola collection (analogamente alle tabelle in un database relazionale). Questa flessibilità facilita la modellazione di dati di qualsiasi struttura e l'adattamento del modello al variare dei requisiti.
In secondo luogo, non è necessario indicare la struttura dei documenti al database: i documenti sono autodescrittivi. Gli sviluppatori possono iniziare a scrivere codice e salvare gli oggetti man mano che vengono creati.
In terzo luogo, se occorre aggiungere a un documento un nuovo campo, questo può essere creato senza conseguenze su tutti gli altri documenti nella raccolta, senza aggiornare un catalogo di sistema centrale e senza mettere offline il database. Quando è necessario apportare modifiche al modello dati, il database di documenti continua a memorizzare gli oggetti aggiornati senza la necessità di eseguire costose operazioni ALTER TABLE, o peggio, di riprogettare lo schema da zero.
Grazie a questi vantaggi, la flessibilità del data model doc si adatta bene alle esigenze delle moderne pratiche di sviluppo delle applicazioni.
Sebbene uno schema flessibile sia una funzionalità potente, in alcune situazioni potrebbe essere necessario un maggiore controllo sulla struttura dei dati e sul contenuto dei documenti. La maggior parte dei database di documenti rimanda l'applicazione di questi controlli allo sviluppatore, che deve implementarli nel codice dell'applicazione. Tuttavia, database di documenti più avanzati forniscono la schema validation, utilizzando approcci come lo standard IETF JSON Schema adottato da MongoDB. Prova subito MongoDB Atlas Online.
Puoi utilizzare gli strumenti JSON online per eseguire la conversione tra BSON e JSON. MongoDB fornisce anche lo strumento bsondump per convertire BSON in JSON.
BSON offre i seguenti vantaggi rispetto a JSON:
BSON supporta più tipi di dati, come data, ora e dati binari.
La struttura binaria di BSON consente di consultare e recuperare i dati più rapidamente.
BSON fornisce metadati aggiuntivi, come informazioni sulla lunghezza e sul tipo, rendendo così le ricerche più veloci.
BSON è la serializzazione in codice binario dei dati JSON. Mentre la stringa JSON è leggibile dall'uomo, la stringa BSON deve essere decodificata. BSON offre i vantaggi aggiuntivi di avere più tipi di dati, di essere leggero e facilmente consultabile e di archiviare i dati in modo più efficiente. È inoltre utile per la codifica e la decodifica con molti linguaggi di programmazione.
Per maggiori informazioni, consulta le risorse correlate: