Deutsch

Entwicklertools · Syntaxkonverter

YAML-Funktionen, die bei einer JSON-Konvertierung verloren gehen: Kommentare, Anker und Tags

· Wie es funktioniert

yaml json Datenformate

YAML Kommentare und Anker werden ausgeblendet, während die aufgelösten Daten in JSON fortgesetzt werden.
Original-ToolAcre-Vektorillustration

YAML verfügt über Kommentare, Anker, Aliase, Zusammenführungsschlüssel, Tags und Multi-Dokument-Streams; JSON hat keines davon. In diesem Beitrag wird erklärt, was ein Konverter mit jeder Datei macht und warum bei der Rückkonvertierung nie die Originaldatei wiederhergestellt wird.

Die Datei kam länger und ohne einen einzigen Kommentar zurück – eine YAML-Konfiguration, die in JSON und zurück konvertiert wurde, und alles, was nicht überlebte

Eine YAML-Datei kann länger von JSON zurückkehren, selbst nachdem jeder Kommentar verschwunden ist. Anker, die eine gemeinsame Zuordnung hatten, werden in wiederholte Objektdaten aufgelöst, sodass der Serialisierer jede Kopie unabhängig schreibt. Die Werte stimmen vielleicht immer noch überein, doch die Autorenstruktur und Erklärung sind verschwunden.

Aus diesem Grund sollte ein Roundtrip von YAML nach JSON nach YAML als Datenkonvertierung und nicht als Quellenerhaltung beurteilt werden. ToolAcre liest ein Diagramm mit eingeschränkten Werten und schreibt ein neues Dokument. Es behält niemals einen konkreten Syntaxbaum bei, der Kommentare, Ankernamen, Anführungszeichen oder eine Block-Skalar-Darstellung enthält.

Kommentare – warum JSON keinen Platz für sie hat und jede #-Zeile nach der Konvertierung weg ist

Kommentare werden vom Parser YAML verworfen, da JSON keinen Kommentarknoten hat. Eine Zeile, die mit `#` beginnt, kann erklären, warum eine Zeitüberschreitung vorliegt oder wem ein Dienst gehört. Einmal entfernt, kann kein Algorithmus mehr auf den Wortlaut oder die Platzierung schließen. Durch die Rückkonvertierung wird ein gültiger YAML ohne diesen Betriebskontext erstellt.

Behalten Sie die Originaldatei in der Versionskontrolle bei und überprüfen Sie die Unterschiede, bevor Sie sie ersetzen. Wenn das Ziel nur darin besteht, aufgelöste Werte zu überprüfen, ist JSON nützlich. Wenn das Ziel eine Neuformatierung unter Beibehaltung des Kommentars ist, ist dieser generische Wertekonverter die falsche Darstellung.

Anker und Aliase – &default und *default werden in wiederholte Kopien erweitert und wie die Datei dadurch wächst

Anker und Aliase werden innerhalb der Sicherheitsgrenzen akzeptiert und dann aufgelöst. `base: &b {x: 1}` und `copy: *b` werden zu zwei Objektpfaden, die `x: 1` enthalten. Die Ausgabe YAML verwendet `noRefs`, sodass die gemeinsame Objektidentität keine neuen Anker erstellt. Die kompakte Beziehung verschwindet auch dann, wenn die wiederholten Werte bestehen bleiben.

Rekursive Aliase werden abgelehnt, da JSON keine Zyklen ausdrücken kann. Die Alias-Erweiterung wird durch die Alias-Anzahl, die Verschachtelung und eine Messung der erweiterten Knoten begrenzt. Ein kurzes Dokument, das in mehr als eine Million Werte zerfällt, wird gestoppt. Dies schützt die Registerkarte, ohne willkürliche YAML-Unterstützung zu beanspruchen.

Zusammenführungsschlüssel – die <<:-Konvention aus YAML 1.1, wie Parser, die sie unterstützen, die zusammengeführte Zuordnung reduzieren und was in denen passiert, die dies nicht tun

Die Gliederung geht davon aus, dass YAML 1.1 Zusammenführungsschlüssel abgeflacht sind. ToolAcre lädt nur das JSON- oder Core-Schema von js-yaml, von denen keines den Merge-Typ aktiviert. Bei diesen Schemata handelt es sich bei einem `<<`-Schlüssel um gewöhnliche Daten und nicht um eine Anweisung zum Zusammenführen von Zuordnungen. Es wäre daher falsch, eine abgeflachte Zusammenführung als ausgeliefertes Verhalten darzustellen.

Wenn Ihre Quelle von der Merge-Key-Semantik abhängt, lösen Sie sie in der Anwendung auf, die diese Konvention besitzt, oder schreiben Sie die Werte vor der Konvertierung explizit neu. Ein Alias, der als Wert von gewöhnlichem `<<` verwendet wird, kann immer noch in ein Objekt aufgelöst werden, aber der Schlüssel bleibt `<<`; Dies ist nicht gleichbedeutend mit der Zusammenführung seiner Mitglieder mit dem übergeordneten Element.

Zusammenführungsschlüssel werden von den beiden eingeschränkten Schemata, die dieser Konverter ausliefert, nicht aktiviert

Standardmäßige explizite Tags, die vom eingeschränkten Schema erkannt werden, können Basistypen auswählen, z. B. `!!str` oder `!!int`. Benutzerdefinierte und umfangreichere Tags – einschließlich Binär-, Zeitstempel-, Satz-, geordnete Map-, JavaScript-Funktions- und Python-Objektkonstruktoren – werden abgelehnt. Sie sind nicht bespannt und werden nie ausgeführt.

Ein YAML-Stream, getrennt durch `---`, wird akzeptiert. Ein Dokument wird zu einem Wert; Mehrere werden zu einem Array mit einer Warnung, die die Anzahl der Dokumente angibt. Ein abschließendes Trennzeichen kann ein leeres Enddokument gemäß dem ausgewählten Schema erstellen. Kein Ziel verfügt hier über ein Stream-Modell, daher ist das Array eine deklarierte Konvention.

Unsichere Tags werden abgelehnt; Multi-Dokument-Streams werden zu Arrays

Verwenden Sie `defaults: &d` mit Wiederholungsversuchen und Timeout, einem Kommentar, der das Timeout erklärt, dann `service:` mit `inherited: *d`. JSON enthält sowohl Standardwerte als auch ein wiederholtes geerbtes Objekt; Der Kommentar und der Ankername fehlen. Durch die Rückkonvertierung von JSON werden zwei Zuordnungen anstelle einer Ankerbeziehung ausgegeben.

Fügen Sie `---` gefolgt von einem weiteren Dokument hinzu, und der Stamm JSON wird zu einem Array von Dokumenten. Fügen Sie `!!binary` und Konvertierungsstopps mit einem Hinweis auf ein eingeschränktes Schema hinzu. Diese drei Änderungen unterscheiden aufgelöste unterstützte Daten, strukturelle Konventionen und völlig nicht unterstützte Konstruktionen.

Was dies nicht abdeckt – Tastenreihenfolge und Zitatstil, die normalerweise erhalten bleiben, aber von keinem der Formate garantiert werden

Die normale Einfügereihenfolge von Objekten bleibt oft sichtbar, es handelt sich jedoch nicht um eine Beibehaltung im Quellstil, und durch die Auswahl von Sortierschlüsseln wird sie absichtlich geändert. Zitate, Fließ- versus Blockstil, skalare Schreibweise und Kommentare bleiben nicht erhalten. Doppelte Zuordnungsschlüssel behalten den letzten Wert mit einer Warnung bei, anstatt beide ungültigen Einträge beizubehalten.

Der Autor schützt mehrdeutige Zeichenfolgen, indem er Werte in Anführungszeichen setzt, die ein YAML 1.1 Verbraucher möglicherweise falsch versteht, aber diese Sicherheitsauswahl kann vom ursprünglichen Stil des Autors abweichen. Datengleichheit ist der vertretbare Test für gewöhnliche JSON-förmige Werte; Textgleichheit ist es nicht.

Die Tastenreihenfolge bleibt möglicherweise erhalten, während Kommentare, Anker, Tag-Schreibweise und -Stil nicht beibehalten werden

YAML-to-JSON ist immer dann verlustbehaftet, wenn die Bedeutung außerhalb des JSON-förmigen Werts liegt: Kommentare, Aliase, nicht unterstützte Tags, Stream-Grenzen als solche und Stil. ToolAcre macht mehrere Verluste sichtbar und lehnt gefährliche oder zyklische Konstrukte ab, anstatt vorzutäuschen, sie zu bewahren.

Konvertieren Sie eine repräsentative Datei, bevor Sie den Workflow übernehmen. Untersuchen Sie Warnungen, unterscheiden Sie aufgelöste Werte und behalten Sie den erstellten YAML bei. Das Panel bietet einen hervorragenden Einblick in das, was ein Parser sieht, ist jedoch kein kommentarerhaltender Editor oder ein vollständiger YAML Objektmodelltransformator.

Trennen Sie für eine Migrationsüberprüfung Wertänderungen von Nur-Quellen-Änderungen. Ein tiefer JSON-Vergleich kann feststellen, ob gewöhnliche Werte erhalten geblieben sind, während ein Textunterschied Kommentare, Anker und Stile aufdeckt, die sich zwangsläufig geändert haben. Keiner der Schecks ersetzt den anderen. Würde man den Wertevergleich als verlustfrei bezeichnen, würden Quellinformationen ignoriert; Jede Textänderung als Datenfehler zu bezeichnen, würde die gültige Reserialisierung ignorieren.