Differenze tra YAML e JSON

1. Panoramica

In questo rapido articolo, daremo uno sguardo alle differenze tra YAML e JSON attraverso esempi rapidi e pratici.

2. Formato

Per avere un'immagine migliore, iniziamo guardando le rappresentazioni JSON e YAML di un semplice POJO:

class Person { String name; Integer age; List hobbies; Person manager; }

Per prima cosa, diamo un'occhiata alla sua rappresentazione JSON:

{ "name":"John Smith", "age":26, "hobbies":[ "sports", "cooking" ], "manager":{ "name":"Jon Doe", "age":45, "hobbies":[ "fishing" ], "manager":null } }

La sintassi JSON è un po 'complicata in quanto utilizza una sintassi speciale come le parentesi graffe {} e le parentesi quadre [] per rappresentare oggetti e array.

Successivamente, vediamo come apparirebbe la stessa struttura in YAML:

name: John Smith age: 26 hobbies: - sports - cooking manager: name: Jon Doe age: 45 hobbies: - fishing manager:

La sintassi di YAML sembra un po 'più amichevole in quanto utilizza spazi vuoti per denotare le relazioni tra gli oggetti e' - 'per rappresentare gli elementi dell'array.

Possiamo vedere che sebbene entrambi siano facilmente leggibili, YAML tende ad essere più leggibile dall'uomo.

Un altro punto bonus per YAML è il numero di righe necessarie per rappresentare le stesse informazioni: YAML richiede solo 11 righe, mentre JSON ne richiede 16.

3. Dimensioni

Abbiamo visto nella sezione precedente che YAML è rappresentato in meno righe di JSON, ma questo significa che occupa meno spazio?

Immaginiamo una struttura profondamente nidificata con un genitore e cinque figli rappresentati come JSON:

{ "child":{ "child":{ "child":{ "child":{ "child":{ "child":{ "child":null } } } } } } }

La stessa struttura sarebbe simile in YAML:

child: child: child: child: child: child: child:

A prima vista, potrebbe sembrare che JSON occupi più spazio, ma, in realtà, la specifica JSON non si preoccupa degli spazi bianchi o delle nuove righe e può essere abbreviata come segue:

{"child":{"child":{"child":{"child":{"child":{"child":{"child":null}}}}}}}

Possiamo vedere che la seconda forma è molto più breve e occupa solo 74 byte, mentre il formato YAML richiede 97 byte.

4. Caratteristiche YAML

Oltre alle funzionalità di base fornite da JSON, YAML include funzionalità aggiuntive come vedremo in seguito.

4.1. Commenti

YAML consente i commenti utilizzando # , una funzionalità spesso desiderata quando si lavora con i file JSON:

# This is a simple comment name: John

4.2. Stringhe multilinea

Un'altra caratteristica mancante in JSON ma presente in YAML sono le stringhe multilinea:

website: | line1 line2 line3

4.3. Alias ​​e ancoraggi

Possiamo facilmente assegnare un alias a un elemento specifico usando & e ancorarlo (riferimento) usando * :

httpPort: 80 httpsPort: &httpsPort 443 defaultPort: *httpsPort

5. Prestazioni

A causa della natura semplice della specifica JSON, le sue prestazioni nell'analisi / serializzazione dei dati sono molto migliori di YAML.

Implementeremo un semplice benchmark per confrontare la velocità di analisi di YAML e JSON utilizzando JMH.

Per il benchmark YAML, useremo la famosa libreria snake-yaml e per il nostro benchmark JSON, useremo org-json :

@BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.SECONDS) @Measurement(batchSize = 10_000, iterations = 5) @Warmup(batchSize = 10_000, iterations = 5) @State(Scope.Thread) class Bench { static void main(String[] args) { org.openjdk.jmh.Main.main(args); } @State(Scope.Thread) static class YamlState { public Yaml yaml = new Yaml(); } @Benchmark Object benchmarkYaml(YamlState yamlState) { return yamlState.yaml.load("foo: bar"); } @Benchmark Object benchmarkJson(Blackhole blackhole) { return new JSONObject("{\"foo\": \"bar\"}"); } }

Come ci saremmo potuti aspettare, JSON è il vincitore, essendo circa 30 volte più veloce:

Benchmark Mode Cnt Score Error Units Main2.benchmarkJson thrpt 50 644.085 ± 9.962 ops/s Main2.benchmarkYaml thrpt 50 20.351 ± 0.312 ops/s

6. Disponibilità della libreria

JavaScript è lo standard per il Web, il che significa che è quasi impossibile trovare una lingua che non supporti completamente JSON.

D'altra parte, YAML è ampiamente supportato, ma non è uno standard. Ciò significa che esistono librerie per i linguaggi di programmazione più diffusi, ma a causa della loro complessità potrebbero non implementare completamente le specifiche.

7. Cosa dovrei scegliere?

Questa potrebbe essere una domanda difficile a cui rispondere e in molti casi soggettiva.

Se dobbiamo esporre un set di API REST ad altre applicazioni front-end o back-end, dovremmo probabilmente utilizzare JSON poiché è lo standard di fatto del settore.

Se abbiamo bisogno di creare un file di configurazione che verrà spesso letto / aggiornato dagli umani, YAML potrebbe essere una buona opzione.

Naturalmente, potrebbero esserci anche casi d'uso in cui sia YAML che JSON sarebbero adatti, e sarà solo una questione di gusti.

8. Conclusione

In questo rapido articolo, abbiamo appreso le principali differenze tra YAML e JSON e quali aspetti considerare per prendere una decisione informata su quale scegliere.