YAML setara dengan array objek di JSON

193

Saya memiliki array JSON objek yang saya coba konversi ke YAML.

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

Apakah ada representasi setara di YAML yang bukan hanya JSON? Saya ingin melakukan sesuatu seperti

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

tapi hal terbersih yang pernah saya pikirkan adalah

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

Jawaban:

367

TL; DR

Kamu mau ini:

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

Pemetaan

Setara YAML dari objek JSON adalah pemetaan, yang terlihat seperti ini:

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

Perhatikan bahwa karakter pertama dari kunci dalam pemetaan blok harus dalam kolom yang sama. Untuk menunjukkan:

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

Urutan

Setara dengan array JSON di YAML adalah urutan, yang terlihat seperti salah satu dari ini (yang setara):

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

Dalam urutan blok -s harus dalam kolom yang sama.

JSON ke YAML

Mari ubah JSON Anda menjadi YAML. Inilah JSON Anda:

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

Sebagai titik trivia, YAML adalah superset dari JSON, jadi yang di atas sudah valid YAML — tapi mari kita benar-benar menggunakan fitur YAML untuk membuat ini lebih cantik.

Mulai dari dalam ke luar, kami memiliki objek yang terlihat seperti ini:

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

Pemetaan YAML yang setara adalah:

shares: -75.088
date: 11/27/2015

Kami memiliki dua dari ini dalam array (urutan):

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

Perhatikan bagaimana -garis-garis dan karakter pertama dari tombol pemetaan berbaris.

Akhirnya, urutan ini sendiri merupakan nilai dalam pemetaan dengan kunci AAPL:

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

Parsing ini dan mengubahnya kembali ke JSON menghasilkan hasil yang diharapkan:

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

Anda dapat melihatnya (dan mengeditnya secara interaktif) di sini .

Jordan Running
sumber
Saya telah memperbarui pertanyaan saya untuk mencerminkan bahwa ada beberapa item dalam daftar yang berisi pasangan saham dan tanggal.
Wegry
3
@wegry: Tidak membuat perbedaan. Lihat juga contoh dari situs web YAML: yaml.org/start.html .
Felix Kling
5

Jawaban yang bagus di atas. Cara lain adalah dengan menggunakan alat pembungkus yaml jq yang hebat, yq di https://github.com/kislyuk/yq

Simpan contoh JSON Anda ke file, ucapkan ex.json lalu

yq -y '.' ex.json

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