YAML เทียบเท่าอาร์เรย์ของวัตถุใน JSON


193

ฉันมีชุดของวัตถุ JSON ที่ฉันพยายามแปลงเป็น YAML

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

มีตัวแทนที่เทียบเท่าใน YAML ที่ไม่ใช่แค่ JSON หรือไม่? ฉันต้องการทำบางสิ่งเช่น

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

แต่สิ่งที่สะอาดที่สุดที่ฉันคิดไว้คือ

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

คำตอบ:


367

TL; DR

คุณต้องการสิ่งนี้:

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

แมป

YAML ที่เทียบเท่ากับวัตถุ JSON คือการจับคู่ซึ่งมีลักษณะดังนี้:

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

โปรดทราบว่าอักขระตัวแรกของคีย์ในการแมปบล็อกต้องอยู่ในคอลัมน์เดียวกัน เพื่อสาธิต:

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

ลำดับ

เทียบเท่าของอาร์เรย์ JSON ใน YAML เป็นลำดับซึ่งดูเหมือนว่าอย่างใดอย่างหนึ่งเหล่านี้ (ซึ่งเทียบเท่า):

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

ในลำดับบล็อก-s ต้องอยู่ในคอลัมน์เดียวกัน

JSON ถึง YAML

ลองเปลี่ยน JSON ของคุณเป็น YAML นี่คือ JSON ของคุณ:

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

ในฐานะที่เป็นเรื่องไม่สำคัญ YAML เป็น superset ของ JSON ดังนั้นสิ่งที่กล่าวมาข้างต้นจึงใช้งานได้กับ YAML แล้ว - แต่เราจะใช้คุณสมบัติของ YAML เพื่อสร้างความน่ารักให้มากกว่านี้

เริ่มต้นจากภายในสู่ภายนอกเรามีวัตถุที่มีลักษณะดังนี้:

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

การแมป YAML ที่เทียบเท่าคือ:

shares: -75.088
date: 11/27/2015

เรามีสองสิ่งนี้ในอาร์เรย์ (ลำดับ):

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

สังเกตการ-เรียงแถวและอักขระตัวแรกของปุ่มการแมป

ในที่สุดลำดับนี้เป็นค่าในการแมปด้วยคีย์AAPL:

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

การแยกวิเคราะห์และแปลงกลับเป็น JSON ให้ผลลัพธ์ที่คาดหวัง:

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

คุณสามารถเห็นมัน (และแก้ไขโต้ตอบ) ที่นี่


ฉันได้อัปเดตคำถามของฉันเพื่อสะท้อนว่ามีหลายรายการในรายการที่มีคู่ของหุ้นและวันที่
wegry

3
@wegry: ไม่ได้สร้างความแตกต่าง ดูเพิ่มเติมตัวอย่างจากเว็บไซต์ YAML: yaml.org/start.html
Felix Kling

5

คำตอบที่ดีข้างต้น อีกวิธีหนึ่งคือการใช้เครื่องมือ wrapper yaml jq ที่ยอดเยี่ยม yq ที่https://github.com/kislyuk/yq

บันทึกตัวอย่าง JSON ของคุณไปยังไฟล์เช่น ex.json แล้ว

yq -y '.' ex.json

AAPL:
- shares: -75.088
  date: 11/27/2015
- shares: 75.088
  date: 11/26/2015
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.