Français

Outils de développement · Convertisseurs de syntaxe

YAML à JSON tapez la coercition : comment oui, non et 0777 changent de sens

· Comment ça marche

yaml json formats de données

YAML jetons scalaires se ramifiant en chaînes, nombres, booléens et nuls
Illustration vectorielle originale de ToolAcre

YAML résout les scalaires non cités en types, et les règles diffèrent entre YAML 1.1 et 1.2. Cet article montre exactement comment un convertisseur décide qu'une valeur est un booléen, un entier, un flottant ou une chaîne, et comment contrôler le résultat.

La valeur qui est revenue comme vraie – un simple scalaire YAML signifié comme texte, converti en JSON comme booléen, et le service qui s'est ensuite mal comporté

Une valeur telle que `NO` peut devenir fausse dans un chargeur YAML 1.1, mais ce n'est pas ce que ce convertisseur est livré. Les deux choix ToolAcre utilisent les schémas YAML 1.2, donc `NO`, `yes`, `no`, `on` et `off` restent des chaînes. L'ouverture corrigée est importante car un exemple affirmant que ce panneau transforme `NO` en vrai ou faux enseignerait le contraire de son comportement testé.

Les surprises de type existent toujours. Sous le schéma JSON par défaut, `null` est nul tandis que `~`, une valeur vide et `0o755` restent des chaînes. La sélection de Core modifie ces trois formulaires en null, null et 493. La sortie est utile précisément parce qu'elle expose la valeur JavaScript résolue, plutôt que de prétendre que chaque jeton YAML simple porte un type évident.

La valeur qui est restée sous YAML 1.2

La résolution implicite se produit pendant que js-yaml lit la source. Le schéma restreint sélectionné décide si un scalaire simple correspond à une forme nulle, booléenne ou numérique avant que le convertisseur n'écrive JSON. Citer contourne cette décision : `"0o755"` est du texte sous l'un ou l'autre schéma, et un bloc scalaire reste une chaîne comprenant les sauts de ligne représentés par son indicateur de chomping.

Il s'agit d'une analyse et d'une sérialisation, pas d'un remplacement d'expression régulière. Le lecteur construit des chaînes, des nombres, des booléens, des valeurs nulles, des tableaux et des objets ; `JSON.stringify` émet ensuite ces valeurs avec l'indentation sélectionnée. Les commentaires et l'orthographe des jetons ont déjà disparu au stade de l'écriture, donc aucun sérialiseur ne peut reconstituer si un nombre était à l'origine décimal ou écrit dans une autre notation YAML acceptée.

Les règles YAML 1.1 — oui/no/on/off booléens, 0777 en octal, 1:30 en sexagésimal et les chaînes de version comme 1.10 se lisent comme des flottants

Le plan répertorie YAML 1.1 coercitions telles que le temps sexagésimal et l'octal hérité. Ce sont des risques de compatibilité pertinents, mais ce ne sont pas des modes disponibles ici. ToolAcre n'offre intentionnellement pas de schéma 1.1. Son interface utilisateur indique qu'aucune des options livrées ne lit `NO` comme faux et les tests épinglent ce code de pays et les mots oui, non, activé et désactivé sous forme de chaînes.

Cette limite modifie la méthode de débogage. Si une autre application transforme ces mots en booléens, comparez la configuration de son analyseur avec ToolAcre au lieu d'attendre une sortie identique. Le convertisseur peut montrer ce que produisent ses deux schémas ; il ne peut pas certifier le schéma ou la version utilisée par un exécuteur CI, une infrastructure ou un système de déploiement qui consomme ultérieurement le fichier.

YAML 1.1 les coercitions sont des dangers que ce convertisseur évite

Le schéma JSON par défaut accepte uniquement les orthographes scalaires compatibles avec le modèle de JSON. Core ajoute les formes nulles YAML familières, les entiers hexadécimaux et octaux, Infinity et NaN. Le noyau reste toujours dans un chargeur restreint : les balises d'objet, les dates, les ensembles, les cartes ordonnées et les balises binaires spécifiques au langage sont refusés plutôt que construits.

Infinity et NaN révèlent une autre frontière. JavaScript peut les contenir, mais JSON ne peut pas les écrire. Le convertisseur identifie chaque chemin et avertit que la valeur devient nulle. Il s’agit d’une étape reconnue avec perte, et non d’une conversion sans perte. Un `.inf` cité l'évite car la valeur reste alors la chaîne littérale `.inf`.

Les deux schémas YAML 1.2 livrés diffèrent uniquement sur les formes scalaires documentées

Collez `tilde: ~`, `empty:`, `octal: 0o755`, `country: NO` et `answer: yes`. Avec strict sélectionné, les valeurs JSON sont `"~"`, `""`, `"0o755"`, `"NO"` et `"yes"`. Avec Core sélectionné, seuls les trois premiers changent : le tilde et le vide deviennent nuls, et l'octal devient 493. Le pays et la réponse restent le texte dans les deux sorties.

Citez maintenant chaque valeur et répétez. Les deux schémas renvoient des chaînes car la source indique le type prévu. Cette comparaison est précise au niveau du code et plus utile que de comparer YAML 1.1 avec 1.2 dans un outil qui ne charge jamais 1.1. Il fournit également un moyen révisable pour vérifier un autre analyseur sans deviner à partir de sa seule documentation.

Exemple concret : un fichier sous les schémas strict et Core de ToolAcre

Les balises standard explicites sont acceptées uniquement lorsque le schéma restreint les reconnaît : `!!str 123` devient la chaîne `123`, tandis que `!!int "7"` devient le nombre 7. Les balises telles que `!!binary`, `!!timestamp`, `!!set`, `!!js/function` et les constructeurs d'objets Python sont rejetées. Cela empêche le lecteur YAML de devenir une fabrique d'objets arbitraires.

La citation reste le choix portable lorsqu'une valeur de configuration semble simplement saisie. Il préserve les zéros non significatifs, l'orthographe des versions et les mots sentinelles sans dépendre d'une balise explicite survivant à un autre outil. Le résultat JSON affiche le type choisi, mais il ne peut pas contenir le style de guillemet ou la balise qui a produit cette valeur.

Ce que cela ne couvre pas : analyse au niveau de l'application du JSON résultant, qui peut contraindre à nouveau les types (par exemple, la chaîne '1' en nombre)

Le code d'application peut contraindre à nouveau le JSON résultant. Une API peut lire `"1"` et le convertir en nombre, ou le rejeter par rapport à un schéma. Les convertisseurs de syntaxe s'arrêtent après avoir produit le texte JSON ; il n'exécute pas de validateur de framework, de chargeur de variables d'environnement ou de règle métier. Une conversion propre prouve donc la syntaxe et le mappage, et non l'acceptation par le service final.

Les clés YAML en double constituent un problème distinct. ToolAcre conserve la dernière valeur et signale la clé répétée avec une position. Les flux multidocuments deviennent des tableaux. Ces choix peuvent modifier ce qu'une application voit même lorsque chaque type scalaire est attendu, alors lisez les avertissements plutôt que de juger uniquement le corps JSON formaté.

À retenir : citez tout ce qu'une machine pourrait mal lire - et comment la conversion de YAML en JSON dans le navigateur révèle exactement ce que chaque scalaire a résolu

Citez le texte qui ressemble à un jeton de machine, puis inspectez les types JSON. Utilisez strict lorsque vous voulez le plus petit vocabulaire scalaire en forme de JSON ; choisissez Core délibérément lorsque des formulaires YAML nuls et numériques sont requis. Aucune des deux options n'est YAML 1.1, et aucune n'oblige un consommateur en aval à suivre les mêmes règles.

Le panneau rend visible le choix de son analyseur et renvoie des avertissements pour les valeurs qu'aucune cible ne peut représenter. C'est la promesse honnête : elle révèle comment cette implémentation a résolu chaque scalaire. Il ne revendique pas un comportement YAML universel et ne préserve pas les commentaires, les balises et l'orthographe lors d'un aller-retour.