0
votes

Module "YamL" Python convertissant Yaml inattendu du format JSON

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}'}


2 commentaires

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.


4 Réponses :


1
votes

Utiliser par défaut_flow_style = false

ex: xxx


0 commentaires

1
votes

Le problème est dans le code Python: A dict est un conteneur non ordonné. pprint donne simplement le même ordre de votre sortie YAML: xxx

si la question portait sur le style de la représentation du dernier niveau DICT {"URL ":" {git_url} "} , la réponse a été donnée par @rakesh < / p>


0 commentaires

-1
votes

Tout d'abord, tout ce que vous devriez simplement quitter votre modèle de travail dans un fichier JSON, par exemple INPUT.JSON .: xxx

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

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 ruamel.yaml (Disclaimer je suis le auteur de cet emballage).

Le seul "problème" est que ruamel.yaml préservera également la style (débit) sur votre entrée. C'est exactement ce que vous ne voulez pas.

Vous devez donc marcher récursivement sur la structure de données et changer le Attribut contenant cette information: xxx

qui donne: xxx

ce qui précède fonctionne également bien pour Python2 et Python3

Le test de code supplémentaire pour '{' 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 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.


0 commentaires

0
votes

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


0 commentaires