J'essaie de convertir des données JSON au format YAML, mais d'obtenir une sortie YAML inattendue
Utilisé des outils en ligne utilisés pour convertir JSON en YAML qui donne la sortie YAML souhaitée. Mais lorsque le même JSON utilisé dans le code de Python ci-dessous, obtenez un résultat différent inattendu. P>
- job-template: days-to-keep: 30 description: job description name: '{name}_job' number-to-keep: 30 project-type: multibranch scm: - git: {url: '{git_url}'}
4 Réponses :
Utiliser par défaut_flow_style = false code>
Le problème est dans le code Python: A si la question portait sur le style de la représentation du dernier niveau DICT dict code> est un conteneur non ordonné.
pprint code> donne simplement le même ordre de votre sortie YAML:
{"URL ":" {git_url} "} code>, la réponse a été donnée par @rakesh p> < / p>
Tout d'abord, tout ce que vous devriez simplement quitter votre modèle de travail dans un fichier JSON, par exemple de cette façon, vous pouvez plus facilement adapter votre script traiter différents fichiers. Et le faire
Vous garantit également que les clés de vos objets JSON sont commandées, ce qui n'est pas garanti lorsque vous incluez le JSON comme dict et listes de votre code, au moins pas pour toutes les versions actuelles de Python P> puis parce que YAML 1.2 (Spec délivré en 2009) est un surset de
YAML, vous pouvez simplement utiliser une bibliothèque YAML 1.2 qui conserve l'ordre de clé
Lors du chargement-dumping pour convertir cela au format souhaité. Depuis
Pyyaml est toujours bloqué à la spécification YAML 1.1 émise en 2005, vous
Impossible d'utiliser cela, mais vous pouvez utiliser Le seul "problème" est que Vous devez donc marcher récursivement sur la structure de données et changer le
Attribut contenant cette information: p> qui donne: p> ce qui précède fonctionne également bien pour Python2 et Python3 P > Le test de code supplémentaire pour INPUT.JSON code>.:
ruamel.yaml code> (Disclaimer je suis le
auteur de cet emballage). p>
ruamel.yaml code> préservera également la
style (débit) sur votre entrée. C'est exactement ce que vous ne voulez pas. P>
'{' code> est d'appliquer des citations doubles autour des chaînes qui ne peuvent pas être représentées comme des scalaires simples. Par défaut
ruamel.yaml code> utiliserait des scalaires cotisés simples si les séquences d'échappement supplémentaires disponibles dans les scalaires cotisés de YamL ne sont pas nécessaires pour représenter la chaîne. p> p>
Le changement de commande dans Pyyaml est un obstacle aux modifications de voyage aller-retour aux fichiers YAML et un certain nombre d'autres analyseurs ont cherché à résoudre ce problème.
une valeur d'une valeur de la valeur est Ruamel.YAML qui dit sur son Page d'aperçu : P>
import sys import ruamel.yaml as yaml yaml_str = """\ 3: abc conf: 10: def 3: gij # h is missing more: - what - else """ data = yaml.load(yaml_str, Loader=yaml.RoundTripLoader) data['conf'][10] = 'klm' data['conf'][3] = 'jig' yaml.dump(data, sys.stdout, Dumper=yaml.RoundTripDumper) will give you: 3: abc conf: 10: klm 3: jig # h is missing more: - what - else
Comment ce résultat est-il incorrect? Il contient toutes les informations et constitue un format YAML approprié.
@brunodesthuilliers Le résultat n'est pas incorrect, c'est inattendu.