JSON'daki nesne dizisinin YAML eşdeğeri


194

YAML dönüştürmek çalışıyorum nesneleri bir JSON dizi var.

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

YAML'de sadece JSON değil eşdeğer bir temsil var mı? Gibi bir şey yapmak isterim

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

ama bulduğum en temiz şey

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

Yanıtlar:


368

TL; DR

Bunu istiyorsun:

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

Eşlemeler

JSON nesnesinin YAML eşdeğeri, aşağıdakine benzeyen bir eşlemedir:

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

Bir blok eşlemedeki anahtarların ilk karakterlerinin aynı sütunda olması gerektiğini unutmayın. Göstermek:

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

Diziler

YAML içindeki bir JSON dizisinin eşdeğeri, bunlardan birine (eşdeğer olan) benzeyen bir dizidir:

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

Bir blok dizisinde -s aynı sütunda olmalıdır.

JSON - YAML

JSON'unuzu YAML'a çevirelim. JSON'unuz:

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

Bir trivia noktası olarak, YAML JSON'un bir üst kümesidir, bu yüzden yukarıdakiler zaten geçerli YAML'dir - ama aslında bu güzelliği yapmak için YAML'nin özelliklerini kullanalım.

İçten dışa doğru, şöyle görünen nesnelerimiz var:

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

Eşdeğer YAML eşlemesi:

shares: -75.088
date: 11/27/2015

Bir dizide (sıra) bunlardan ikimiz var:

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

S'nin nasıl -eşleştiğine ve eşleme tuşlarının ilk karakterlerinin nasıl sıralandığına dikkat edin.

Son olarak, bu dizinin kendisi anahtar ile bir eşlemede bir değerdir AAPL:

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

Bunu ayrıştırmak ve tekrar JSON'a dönüştürmek beklenen sonucu verir:

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

Sen görmek (ve etkileşimli düzenlemek) olabilir burada .


Listede paylaşımları ve tarih çiftlerini içeren birden fazla öğe olduğunu yansıtacak şekilde sorumu güncelledim.
wegry

3
@wegry: Fark etmez. Ayrıca YAML web sitesindeki örneğe bakın: yaml.org/start.html .
Felix Kling

5

Yukarıdaki harika cevap. Başka bir yol, harika yaml jq sarmalayıcı aracını kullanmaktır, yq https://github.com/kislyuk/yq

JSON örneğinizi bir dosyaya kaydedin, ex.json deyin ve sonra

yq -y '.' ex.json

AAPL:
- shares: -75.088
  date: 11/27/2015
- shares: 75.088
  date: 11/26/2015
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.