Equivalent YAML d'un tableau d'objets en JSON

193

J'ai un tableau d'objets JSON que j'essaie de convertir en YAML.

{"AAPL": [
  {
    "shares": -75.088,
    "date": "11/27/2015"
  },
  {
    "shares": 75.088,
    "date": "11/26/2015"
  },
]}

Existe-t-il une représentation équivalente dans YAML qui n'est pas seulement JSON? J'aimerais faire quelque chose comme

AAPL:
  - :
    shares: -75.088
    date: 11/27/2015
  - :
    shares: 75.088
    date: 11/26/2015

mais la chose la plus propre que j'ai trouvée est

AAPL:
  - {
    shares: -75.088,
    date: 11/27/2015
  }
  {
    shares: 75.088,
    date: 11/26/2015
  }
wegry
la source

Réponses:

367

TL; DR

Tu veux ça:

AAPL:
  - shares: -75.088
    date: 11/27/2015
  - shares: 75.088
    date: 11/26/2015

Mappages

L'équivalent YAML d'un objet JSON est un mappage, qui ressemble à ceci:

# flow style
{ foo: 1, bar: 2 }
# block style
foo: 1
bar: 2

Notez que les premiers caractères des clés dans un mappage de bloc doivent être dans la même colonne. Démontrer:

# OK
   foo: 1
   bar: 2
# Parse error
   foo: 1
    bar: 2

Séquences

L'équivalent d'un tableau JSON en YAML est une séquence, qui ressemble à l'un de ces éléments (qui sont équivalents):

# flow style
[ foo bar, baz ]
# block style
- foo bar
- baz

Dans une séquence de blocs, les -s doivent être dans la même colonne.

JSON à YAML

Transformons votre JSON en YAML. Voici votre JSON:

{"AAPL": [
  {
    "shares": -75.088,
    "date": "11/27/2015"
  },
  {
    "shares": 75.088,
    "date": "11/26/2015"
  },
]}

Pour simplifier, YAML est un sur-ensemble de JSON, donc ce qui précède est déjà YAML valide - mais utilisons en fait les fonctionnalités de YAML pour rendre cela plus joli.

En partant de l'intérieur, nous avons des objets qui ressemblent à ceci:

{
  "shares": -75.088,
  "date": "11/27/2015"
}

Le mappage YAML équivalent est:

shares: -75.088
date: 11/27/2015

Nous en avons deux dans un tableau (séquence):

- shares: -75.088
  date: 11/27/2015
- shares: 75.088
  date: 11/26/2015

Notez comment les -s s'alignent et les premiers caractères des touches de mappage s'alignent.

Enfin, cette séquence est elle-même une valeur dans un mapping avec la clé AAPL:

AAPL:
  - shares: -75.088
    date: 11/27/2015
  - shares: 75.088
    date: 11/26/2015

L'analyse et la reconversion en JSON donnent le résultat attendu:

{
  "AAPL": [
    {
      "date": "11/27/2015", 
      "shares": -75.088
    }, 
    {
      "date": "11/26/2015", 
      "shares": 75.088
    }
  ]
}

Vous pouvez le voir (et le modifier de manière interactive) ici .

Jordan Running
la source
J'ai mis à jour ma question pour indiquer qu'il y a plusieurs éléments dans la liste contenant des partages et des paires de dates.
wegry
3
@wegry: Cela ne fait aucune différence. Voir également l'exemple du site Web YAML: yaml.org/start.html .
Felix Kling
5

Excellente réponse ci-dessus. Une autre façon consiste à utiliser le formidable outil de wrapper yaml jq, yq à https://github.com/kislyuk/yq

Enregistrez votre exemple JSON dans un fichier, dites ex.json, puis

yq -y '.' ex.json

AAPL:
- shares: -75.088
  date: 11/27/2015
- shares: 75.088
  date: 11/26/2015
Jon Scobie
la source