Wat is het verschil tussen YAML en JSON?

Wat zijn de verschillen tussen YAML en JSON, met name gezien de volgende zaken?

  • Prestaties (codeer-/decodeertijd)
  • Geheugenverbruik
  • Helderheid van uitdrukking
  • Beschikbaarheid bibliotheek, gebruiksgemak (ik geef de voorkeur aan C)

Ik was van plan een van deze twee in ons embedded systeem te gebruiken om configuratiebestanden op te slaan.

Gerelateerd:

Moet ik YAML of JSON gebruiken om mijn Perl-gegevens op te slaan?


Antwoord 1, autoriteit 100%

Technisch gezien is YAML een superset van JSON. Dit betekent dat, in theorie althans, een YAML-parser JSON kan begrijpen, maar niet noodzakelijk andersom.

Zie de officiële specificaties in het gedeelte met de titel “YAML: Relation to JSON”.

Over het algemeen zijn er bepaalde dingen die ik leuk vind aan YAML die niet beschikbaar zijn in JSON.

  • Zoals @jdupont al aangeeft, is YAML visueel gemakkelijker om naar te kijken. In feite is de YAML-homepagezelf een geldige YAML, maar het is voor een mens gemakkelijk te lezen.
  • YAML heeft de mogelijkheid om te verwijzen naar andere items in een YAML-bestand met behulp van ‘ankers’. Het kan dus relationele informatie verwerken zoals men die zou kunnen vinden in een MySQL-database.
  • YAML is robuuster in het insluiten van andere serialisatie-indelingen zoals JSON of XML ineen YAML-bestand.

In de praktijk zal geen van deze laatste twee punten waarschijnlijk van belang zijn voor dingen die jij of ik doen, maar op de lange termijn denk ik dat YAML een robuuster en levensvatbaarder formaat voor gegevensserialisatie zal zijn.

Op dit moment gebruiken AJAX en andere webtechnologieën meestal JSON. YAML wordt momenteel meer gebruikt voor offline dataprocessen. Het is bijvoorbeeld standaard opgenomen in het C-gebaseerde OpenCV computer vision-pakket, terwijl JSON dat niet is.

Je vindt C-bibliotheken voor zowel JSON als YAML. De bibliotheken van YAML zijn meestal nieuwer, maar ik heb er in het verleden geen problemen mee gehad. Zie bijvoorbeeld Yaml-cpp.


Antwoord 2, autoriteit 33%

Verschillen:

  1. YAML kan, afhankelijk van hoe je het gebruikt, leesbaarder zijn dan JSON
  2. JSON is vaak snelleren is waarschijnlijk nog steeds compatibel met meer systemen
  3. Het is mogelijk om heel snel een “goed genoeg” JSON-parser te schrijven
  4. Dubbele sleutels, die mogelijkgeldige JSON zijn, zijn absoluutongeldige YAML.
  5. YAML heeft een heleboel functies, waaronder opmerkingen en relationele ankers. De YAML-syntaxis is daarom behoorlijk complex en kan moeilijk te begrijpen zijn.
  6. Het is mogelijk om recursieve structuren te schrijven in yaml: {a: &b [*b]}, die in sommige converters oneindig zal doorlopen. Zelfs met cirkelvormige detectie is een “yaml-bom” nog steeds mogelijk (zie xml-bom).
  7. Omdat er geen referenties zijn, is het onmogelijk om complexe structuren te serialiseren met objectreferenties in JSON. YAML-serialisatie kan daarom efficiënter zijn.
  8. In sommige codeeromgevingen kan het gebruik van YAML een aanvaller in staat stellen willekeurige code uit te voeren.

Waarnemingen:

  1. Python-programmeurs zijn over het algemeen grote fans van YAML, vanwege het gebruik van inspringing, in plaats van tussen haakjes, om niveaus aan te geven.
  2. Veel programmeurs beschouwen de toevoeging van “betekenis” aan inspringing als een slechte keuze.
  3. Als het gegevensformaat de omgeving van een toepassing verlaat, wordt geparseerd binnen een gebruikersinterface of wordt verzonden in een berichtenlaag, is JSON wellicht een betere keuze.
  4. YAML kan direct worden gebruikt voor complexe taken zoals grammaticadefinities, en is vaak een betere keuze dan het uitvinden van een nieuwe taal.

Antwoord 3, autoriteit 14%

Esoterische theorie omzeilen

Dit beantwoordt de titel, niet de details, aangezien de meesten net als ik de titel lazen uit een zoekresultaat op Google, dus ik vond het nodig om het uit te leggen vanuit het perspectief van een webontwikkelaar.

  1. YAML gebruikt spatie-inspringing, wat bekend terrein is voor Python-ontwikkelaars.
  2. JavaScript-ontwikkelaars zijn dol op JSON omdat het een subset van JavaScript is en direct kan worden geïnterpreteerd en geschreven in JavaScript, samen met een verkorte manier om JSON te declareren, waarbij geen dubbele aanhalingstekens in sleutels nodig zijn bij het gebruik van typische variabelenamen zonder spaties.
  3. li>

  4. Er is een overvloed aan parsers die zeer goed werken in alle talen voor zowel YAML als JSON.
  5. De ruimte-indeling van YAML kan in veel gevallen veel gemakkelijker te bekijken zijn, omdat de opmaak een meer door mensen leesbare benadering vereist.
  6. De vorm van YAML is weliswaar compacter en gemakkelijker om naar te kijken, maar kan bedrieglijk moeilijk met de hand te bewerken zijn als de opmaak van de ruimte niet zichtbaar is in uw editor. Tabbladen zijn geen spaties, dus het is nog verwarrender als je geen editor hebt om je toetsaanslagen in spaties te interpreteren.
  7. JSON is veel sneller te serialiseren en deserialiseren vanwege aanzienlijk minder functies dan YAML om op te controleren, waardoor kleinere en lichtere code JSON kan verwerken.
  8. Een veel voorkomende misvattingis dat YAML minder interpunctie nodig heeft en compacter is dan JSON, maar dit is volledig onjuist. Witruimte is onzichtbaar, dus het lijkt alsof er minder tekens zijn, maar als u de werkelijke witruimte meetelt die nodig is om YAML correct te laten interpreteren, samen met de juiste inspringing, zult u merken dat YAML eigenlijk meer tekens vereist dan JSON. JSON gebruikt geen witruimte om hiërarchie of groepering weer te geven en kan eenvoudig worden afgevlakt met onnodige witruimte verwijderd voor compacter transport.

De olifant in de kamer: het internet zelf

JavaScript domineert zo duidelijk het web met een enorme marge en JavaScript-ontwikkelaars geven er de voorkeur aan om JSON als het gegevensformaat overweldigend samen met populaire web-API’s te gebruiken, dus het wordt moeilijk om YAML boven JSON te gebruiken bij webprogrammering in de algemene zin, zoals u wilt waarschijnlijk overstemd worden in een teamomgeving. In feite weten de meeste webprogrammeurs niet eens dat YAML bestaat, laat staan overwegen het te gebruiken.

Als u webprogrammering uitvoert, is JSON de standaardmanier om te gaan, omdat er geen vertaalstap nodig is bij het werken met JavaScript, dus u moet in dat geval een beter argument bedenken om YAML via JSON te gebruiken.


Antwoord 4, autoriteit 8%

Deze vraag is 6 jaar oud, maar vreemd genoeg gaat geen van de antwoorden echt over alle vier de punten (snelheid, geheugen, expressiviteit, draagbaarheid).

Snelheid

Dit is uiteraard afhankelijk van de implementatie, maar omdat JSON zo veel wordt gebruikt en zo gemakkelijk te implementeren is, heeft het de neiging om meer native ondersteuning en dus snelheid te krijgen. Aangezien YAML alles doet wat JSON doet, plus een vrachtwagenlading meer, is het waarschijnlijk dat van vergelijkbare implementaties van beide, de JSON-versie sneller zal zijn.

Aangezien een YAML-bestand echter iets kleiner kan zijn dan zijn JSON-tegenhanger (vanwege minder "en ,tekens), is het mogelijkdat een sterk geoptimaliseerde YAML-parser in uitzonderlijke omstandigheden sneller zou kunnen zijn.

Geheugen

In principe is hetzelfde argument van toepassing. Het is moeilijk in te zien waarom een YAML-parser ooit geheugenefficiënter zou zijn dan een JSON-parser, als ze dezelfde gegevensstructuur vertegenwoordigen.

Expressiviteit

Zoals anderen al hebben opgemerkt, hebben Python-programmeurs de neiging om YAML en JavaScript-programmeurs te prefereren boven JSON. Ik zal deze opmerkingen maken:

  • Het is gemakkelijk om de volledige syntaxis van JSON te onthouden, en daarom heb je veel vertrouwen in het begrijpen van de betekenis van elk JSON-bestand. YAML is voor geen enkel mens echt begrijpelijk. Het aantal subtiliteiten en randgevallen is extreem.
  • Omdat maar weinig parsers de volledige specificatie implementeren, is het nog moeilijker om zeker te zijn over de betekenis van een bepaalde uitdrukking in een bepaalde context.
  • Het gebrek aan opmerkingen in JSON is in de praktijk een groot probleem.

Draagbaarheid

Het is moeilijk om je een moderne taal voor te stellen zonder een JSON-bibliotheek. Het is ook moeilijk voor te stellen dat een JSON-parser iets minder dan de volledige specificaties implementeert. YAML heeft brede ondersteuning, maar is minder alomtegenwoordig dan JSON, en elke parser implementeert een andere subset. Daarom zijn YAML-bestanden minder interoperabel dan je zou denken.

Samenvatting

JSON is de winnaar voor prestaties (indien relevant) en interoperabiliteit. YAML is beter voor door mensen onderhouden bestanden. HJSONis een behoorlijk compromis, hoewel met veel verminderde draagbaarheid. JSON5is een redelijker compromis, met goed gedefinieerde syntaxis.


Antwoord 5, autoriteit 6%

GIT en YAML

De andere antwoorden zijn goed. Lees die eerst. Maar ik zal nog een andere reden toevoegen om YAML soms te gebruiken: git.

Steeds vaker gebruiken veel programmeerprojecten git-repositories voor distributie en archivering. En hoewel de geschiedenis van een git-repo zowel JSON- als YAML-bestanden kan opslaan, is de “diff”-methode die wordt gebruikt voor het volgen en weergeven van wijzigingen in een bestand lijngericht. Omdat YAML gedwongen wordt om lijngericht te zijn, zijn kleine wijzigingen in een YAML-bestand gemakkelijker te zien door een mens.

Het is natuurlijk waar dat JSON-bestanden “mooi gemaakt” kunnen worden door de strings/sleutels te sorteren en inspringing toe te voegen. Maar dit is niet de standaard en ik ben lui.

Persoonlijk gebruik ik JSON over het algemeen voor systeem-naar-systeem interactie. Ik gebruik YAML vaak voor configuratiebestanden, statische bestanden en bijgehouden bestanden. (Over het algemeen vermijd ik ook om relationele YAML-ankers toe te voegen. Het leven is te kort om loops op te sporen.)

Als snelheid en ruimte echt een probleem zijn, gebruik ik geen van beide. Je zou eens naar BSON kunnen kijken.


Antwoord 6, autoriteit 3%

Ik vind YAML prettiger voor de ogen: minder haakjes, “” enz. Hoewel er de ergernis is van tabbladen in YAML… maar je krijgt het onder de knie.

In termen van prestaties/bronnen verwacht ik geen grote verschillen tussen de twee.

Bovendien hebben we het over configuratiebestanden en dus verwacht ik geen hoge frequentie van codeer-/decodeeractiviteit, toch?


Antwoord 7, autoriteit 3%

Als je geen functies nodig hebt die YAML wel heeft en JSON niet, dan zou ik de voorkeur geven aan JSON omdat het heel eenvoudig is en breed wordt ondersteund (met veel bibliotheken in vele talen). YAML is complexer en heeft minder ondersteuning. Ik denk niet dat de parseersnelheid of het geheugengebruik veel zullen verschillen, en misschien niet een groot deel van de prestaties van je programma.


Antwoord 8, autoriteit 3%

Technisch gezien biedt YAMLveel meer dan JSON(YAML v1.2 is een superset van JSON):

  • opmerkingen
  • ankers en overerving – voorbeeld van 3 identieke items:

    item1: &anchor_name
      name: Test
      title: Test title
    item2: *anchor_name
    item3:
      <<: *anchor_name
      # You may add extra stuff.
    

Meestal zullen mensen die extra functies niet gebruiken en het belangrijkste verschil is dat YAML inspringing gebruiktterwijl JSON haakjes gebruikt. Dit maakt YAML beknopter en leesbaar(voor het geoefende oog).

Welke te kiezen?

  • YAMLextra functies en beknopte notatie maken het een goede keuze voor configuratiebestanden(niet door de gebruiker geleverde bestanden).
  • JSONbeperkte functies, brede ondersteuning en snellere parsering maken het een uitstekende keuze voor interoperabiliteit en door de gebruiker verstrekte gegevens.

Antwoord 9

Uit: Arnaud Lauret Book “The Design of Web API’s.” :

Het JSON-gegevensformaat

JSONis een tekstgegevensindeling die is gebaseerd op hoe de JavaScript-programmeertaal gegevens beschrijft, maar ondanks de naam volledig taalonafhankelijk is (zie https://www.json.org/). Met behulp van JSONkunt u objecten beschrijven die ongeordende naam/waarde-paren bevatten en ook arrays of lijsten met geordende waarden, zoals weergegeven in deze afbeelding.

Een object wordt gescheiden door krullende beugels ({}). Een naam is een genoteerde string (“naam”) en is ingeschakeld van zijn waarde door een dikke darm (:). Een waarde kan een tekenreeks zijn zoals “waarde”, een cijfer zoals 1.23, een boolean (true of false), de nulwaarde null, een object of een array. Een array wordt gescheiden door beugels ([]) en de waarden worden gescheiden door komma’s (,).
De JSON -indeling is gemakkelijk geparseerd met behulp van elke programmeertaal. Het is ook relatief eenvoudig te lezen en te schrijven. Het wordt veel aangenomen voor veel gebruik, zoals databases, configuratie-bestanden en, natuurlijk, API’s.

yaml

yaml (yaml is geen markup taal) is een mensvriendelijk, data-serialisatie-formaat. Net als JSON, YAML (http://yaml.org ) is een sleutel / waarde-gegevensformaat. De figuur toont een vergelijking van de twee.

Let op de volgende punten:

  • Er zijn geen dubbele aanhalingstekens (“”) rond vastgoednamen en waarden in yaml .

  • JSON’s structurele krullende beugels ({}) en komma’s (,) worden vervangen door newlines en
    inkeping in yaml .

  • Array-beugels ([]) en komma’s (,) worden vervangen door streepjes (-) en newlines in
    yaml .

  • In tegenstelling tot JSON , Yaml Hiermee kunnen opmerkingen beginnen met een hash-markering (#).
    Het is relatief eenvoudig om een ​​van die formaten in de andere te converteren. Wees gewaardeerd, je verliest opmerkingen bij het converteren van een yaml document naar JSON .


Antwoord 10

Benchmark Resultaten

Hieronder staan de resultaten van een benchmark om de laadtijden van YAML en JSON op Python en Perl te vergelijken

JSON is veel sneller, ten koste van enige leesbaarheid en functies zoals opmerkingen

Testmethode

Resultaten

Python 3.8.3 timeit
    JSON:            0.108
    YAML CLoader:    3.684
    YAML:           29.763
Perl 5.26.2-043 Benchmark::cmpthese
    JSON XS:         0.107
    YAML XS:         0.574
    YAML Syck:       1.050
Perl 5.26.2-043 Dumbbench (Brian D Foy, excludes outliers)
    JSON XS:         0.102
    YAML XS:         0.514
    YAML Syck:       1.027

Antwoord 11

Aangezien deze vraag nu prominent aanwezig is bij het zoeken naar YAML en JSON, is het de moeite waard om een zelden genoemd verschil tussen de twee op te merken: licentie. JSON beweert een licentiete hebben waaraan JSON-gebruikers zich moeten houden gebruikt voor Goed, niet Kwaad”). YAML heeft een dergelijke licentieclaim niet, en dat kan een belangrijk verschil zijn (voor uw advocaat, zo niet voor u).


Antwoord 12

Soms hoef je niet voor de een boven de ander te kiezen.

In Go kunt u bijvoorbeeld beide tegelijk hebben:

type Person struct {
    Name string `json:"name" yaml:"name"`
    Age int `json:"age" yaml:"age"`
}

Antwoord 13

Ik vind zowel YAML als JSON erg effectief. De enige twee dingen die voor mij echt bepalen wanneer de ene boven de andere wordt gebruikt, is één, waarmee de taal het meest wordt gebruikt. Als ik bijvoorbeeld Java, Javascript gebruik, gebruik ik JSON. Voor Java zal ik hun eigen objecten gebruiken, die vrijwel JSON zijn maar sommige functies missen, en deze naar JSON converteren als dat nodig is, of het in de eerste plaats in JSON maken. Ik doe dat omdat dat gebruikelijk is in Java en het voor andere Java-ontwikkelaars gemakkelijker maakt om mijn code aan te passen. Het tweede is of ik het gebruik voor het programma om attributen te onthouden, of dat het programma instructies ontvangt in de vorm van een configuratiebestand, in dit geval zal ik YAML gebruiken, omdat het heel gemakkelijk door mensen te lezen is, heeft mooie uitziende syntaxis, en is heel gemakkelijk aan te passen, zelfs als je geen idee hebt hoe YAML werkt. Vervolgens zal het programma het lezen en converteren naar JSON, of wat dan ook de voorkeur heeft voor die taal.

Uiteindelijk maakt het eerlijk gezegd niet uit. Zowel JSON als YAML zijn gemakkelijk te lezen door elke ervaren programmeur.


Antwoord 14

Javascript-ontwikkelaar zoals JSON, en python-ontwikkelaar geven de voorkeur aan YMAL


Antwoord 15

Als u zich zorgen maakt over een betere parseersnelheid, dan is het opslaan van de gegevens in JSON de optie. Ik moest de gegevens ontleden van een locatie waar het bestand onderhevig was aan wijzigingen door andere gebruikers en daarom gebruikte ik YAML omdat het een betere leesbaarheid biedt in vergelijking met JSON.
En je kunt ook opmerkingen toevoegen aan het YAML-bestand, wat niet mogelijk is in een JSON-bestand.

Other episodes