Forskelle mellem YAML og JSON

1. Oversigt

I denne hurtige artikel vil vi se på forskellene mellem YAML og JSON gennem hurtige og praktiske eksempler.

2. Format

For at få et bedre billede, lad os starte med at se på JSON- og YAML-repræsentationerne af en simpel POJO:

klasse Person {String name; Heltal alder Liste hobbyer Personleder; }

Lad os først se på dets JSON-repræsentation:

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

JSON-syntaks er noget besværligt, da den bruger speciel syntaks som krøllede seler {} og firkantede parenteser [] at repræsentere objekter og arrays.

Lad os derefter se, hvordan den samme struktur ville se ud i YAML:

navn: John Smith alder: 26 hobbyer: - sport - madlavning manager: navn: Jon Doe alder: 45 hobbyer: - fiskeri manager:

YAMLs syntaks ser lidt venligere ud, da den bruger tomme mellemrum til at betegne forholdet mellem objekter og ''At repræsentere matrixelementer.

Vi kan se, at selvom begge er let læselige, har YAML en tendens til at være mere menneskelig læsbar.

Et andet bonuspoint for YAML er antallet af linjer, det tager at repræsentere den samme information - YAML tager kun 11 linjer, mens JSON tager 16.

3. Størrelse

Vi har set i det forrige afsnit, at YAML er repræsenteret i færre linjer end JSON, men betyder det, at det tager mindre plads?

Lad os forestille os en dybt indlejret struktur med en forælder og fem børn repræsenteret som JSON:

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

Den samme struktur ville se ens ud i YAML:

barn: barn: barn: barn: barn: barn: barn:

Ved første øjekast kan det se ud som om JSON tager mere plads, men i virkeligheden er JSON-specifikationen ikke ligeglad med mellemrum eller nye linjer, og den kan afkortes som følger:

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

Vi kan se, at den anden form er meget kortere, og den optager kun 74 byte, mens YAML-formatet tager 97 byte.

4. YAML-funktioner

Udover de grundlæggende funktioner, som JSON giver, leveres YAML med yderligere funktionalitet, som vi ser næste.

4.1. Kommentarer

YAML tillader kommentarer ved hjælp af #, en funktion, der ofte ønskes, når du arbejder med JSON-filer:

# Dette er et simpelt kommentarnavn: John

4.2. Multi-Line strenge

En anden funktion, der mangler i JSON, men er til stede i YAML, er streng med flere linjer:

websted: | linje1 linje2 linje3

4.3. Aliaser og ankre

Vi kan nemt tildele et alias til et bestemt element ved hjælp af & og forankre (reference) det ved hjælp af *:

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

5. Ydeevne

På grund af den enkle karakter af JSON-specifikationen er dens ydeevne ved parsing / serialisering af data meget bedre end YAML.

Vi implementerer et simpelt benchmark for at sammenligne parsningshastigheden for YAML og JSON ved hjælp af JMH.

For YAML-benchmarket skal vi bruge det velkendte slange-yaml bibliotek, og til vores JSON-benchmark bruger vi 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 {statisk ugyldig hoved ( Streng [] args) {org.openjdk.jmh.Main.main (args); } @State (Scope.Thread) statisk klasse YamlState {offentlig Yaml yaml = ny Yaml (); } @Benchmark Objekt benchmarkYaml (YamlState yamlState) {return yamlState.yaml.load ("foo: bar"); } @Benchmark ObjektbenchmarkJson (Blackhole blackhole) {return new JSONObject ("{\" foo \ ": \" bar \ "}"); }}

Som vi måske havde forventet, er JSON vinderen og er cirka 30 gange hurtigere:

Benchmark Mode Cnt Score Fejlenheder Main2.benchmarkJson thrpt 50 644.085 ± 9.962 ops / s Main2.benchmark Yaml thrpt 50 20.351 ± 0.312 ops / s

6. Tilgængelighed af biblioteket

JavaScript er standarden for internettet, hvilket betyder, at det næsten er umuligt at finde et sprog, der ikke fuldt ud understøtter JSON.

På den anden side understøttes YAML bredt, men det er ikke en standard. Dette betyder, at der findes biblioteker til de mest populære programmeringssprog, men på grund af dets kompleksitet implementerer de muligvis ikke specifikationen fuldt ud.

7. Hvad skal jeg vælge?

Dette kan være et vanskeligt spørgsmål at besvare og et subjektivt spørgsmål i mange tilfælde.

Hvis vi har brug for at udsætte et sæt REST API'er for andre front-end eller back-end applikationer, bør vi sandsynligvis gå med JSON, da det er de facto industristandard.

Hvis vi har brug for at oprette en konfigurationsfil, der ofte læses / opdateres af mennesker, kan YAML være en god mulighed.

Selvfølgelig kan der også være brugstilfælde, hvor både YAML og JSON passer godt, og det vil bare være et spørgsmål om smag.

8. Konklusion

I denne hurtige artikel har vi lært de vigtigste forskelle mellem YAML og JSON, og hvilke aspekter der skal overvejes for at træffe en informeret beslutning om, hvilken vi skal vælge.