YAML - คู่มือฉบับย่อ

YAML ไม่ใช่ภาษามาร์กอัปเป็นภาษาอนุกรมข้อมูลที่ตรงกับความคาดหวังของผู้ใช้เกี่ยวกับข้อมูล ออกแบบมาให้เป็นมิตรกับมนุษย์และทำงานร่วมกับภาษาโปรแกรมอื่น ๆ ได้อย่างสมบูรณ์แบบ มีประโยชน์ในการจัดการข้อมูลและรวมอักขระที่สามารถพิมพ์ได้ของ Unicode บทนี้จะให้ข้อมูลเบื้องต้นเกี่ยวกับ YAML และให้แนวคิดเกี่ยวกับคุณลักษณะต่างๆ

รูปแบบ

พิจารณาข้อความที่แสดงด้านล่าง -

Quick brown fox jumped over the lazy dog.

ข้อความ YAML สำหรับสิ่งนี้จะแสดงดังที่แสดงด้านล่าง -

yaml.load(Quick brown fox jumped over the lazy dog.)
>>'Quick brown fox jumped over the lazy dog.'

โปรดทราบว่า YAML รับค่าในรูปแบบสตริงและแสดงผลลัพธ์ตามที่กล่าวไว้ข้างต้น

ตัวอย่าง

ให้เราเข้าใจรูปแบบใน YAML โดยใช้ตัวอย่างต่อไปนี้ -

พิจารณาหมายเลขจุดต่อไปนี้ของ“ pi” ซึ่งมีค่า 3.1415926 ใน YAML แสดงเป็นตัวเลขลอยตามที่แสดงด้านล่าง -

>>> yaml.load('3.1415926536')
3.1415926536

สมมติว่าต้องโหลดหลายค่าในโครงสร้างข้อมูลเฉพาะดังที่กล่าวไว้ด้านล่าง -

eggs
ham
spam
French basil salmon terrine

เมื่อคุณโหลดสิ่งนี้ลงใน YAML ค่าจะถูกนำมาใช้ในโครงสร้างข้อมูลอาร์เรย์ซึ่งเป็นรูปแบบของรายการ ผลลัพธ์ดังแสดงด้านล่าง -

>>> yaml.load('''
   - eggs
   - ham
   - spam
   - French basil salmon terrine
   ''')
['eggs', 'ham', 'spam', 'French basil salmon terrine']

คุณสมบัติ

YAML มีภาษามาร์กอัปที่มีโครงสร้างที่สำคัญเพื่อแยกความแตกต่างของภาษาที่มุ่งเน้นข้อมูลด้วยมาร์กอัปเอกสาร เป้าหมายการออกแบบและคุณสมบัติของ YAML มีดังต่อไปนี้ -

  • จับคู่โครงสร้างข้อมูลดั้งเดิมของวิธีการแบบ Agile และภาษาของมันเช่น Perl, Python, PHP, Ruby และ JavaScript

  • ข้อมูล YAML เป็นแบบพกพาระหว่างภาษาโปรแกรม

  • รวมรูปแบบข้อมูลที่สอดคล้องกันของข้อมูล

  • มนุษย์สามารถอ่านได้ง่าย

  • รองรับการประมวลผลทิศทางเดียว

  • ติดตั้งและใช้งานง่าย

เมื่อคุณมีความคิดเกี่ยวกับ YAML และคุณลักษณะต่างๆแล้วให้เราเรียนรู้พื้นฐานเกี่ยวกับไวยากรณ์และการดำเนินการอื่น ๆ โปรดจำไว้ว่า YAML มีรูปแบบโครงสร้างที่มนุษย์อ่านได้

กฎสำหรับการสร้างไฟล์ YAML

เมื่อคุณสร้างไฟล์ใน YAML คุณควรจำกฎพื้นฐานต่อไปนี้ -

  • YAML พิจารณาตัวพิมพ์เล็กและตัวพิมพ์ใหญ่

  • ไฟล์ควรมี .yaml เป็นส่วนขยาย

  • YAML ไม่อนุญาตให้ใช้แท็บในขณะที่สร้างไฟล์ YAML อนุญาตให้เว้นวรรคแทน

ส่วนประกอบพื้นฐานของไฟล์ YAML

ส่วนประกอบพื้นฐานของ YAML อธิบายไว้ด้านล่าง -

รูปแบบบล็อกธรรมดา

รูปแบบบล็อกนี้ใช้ hyphen+spaceเพื่อเริ่มรายการใหม่ในรายการที่ระบุ สังเกตตัวอย่างที่แสดงด้านล่าง -

--- # Favorite movies
 - Casablanca
 - North by Northwest
 - The Man Who Wasn't There

Inline Format

รูปแบบอินไลน์ถูกคั่นด้วย comma and spaceและรายการจะอยู่ใน JSON สังเกตตัวอย่างที่แสดงด้านล่าง -

--- # Shopping list
   [milk, groceries, eggs, juice, fruits]

Folded Text

ข้อความที่พับจะแปลงบรรทัดใหม่เป็นช่องว่างและลบช่องว่างที่นำหน้าออก สังเกตตัวอย่างที่แสดงด้านล่าง -

- {name: John Smith, age: 33}
- name: Mary Smith
  age: 27

โครงสร้างที่เป็นไปตามอนุสัญญาพื้นฐานทั้งหมดของ YAML แสดงไว้ด้านล่าง -

men: [John Smith, Bill Jones]
women:
  - Mary Smith
  - Susan Williams

เรื่องย่อของ YAML Basic Elements

  • บทสรุปขององค์ประกอบพื้นฐานของ YAML มีให้ที่นี่: ความคิดเห็นใน YAML เริ่มต้นด้วย (#) ตัวละคร

  • ความคิดเห็นต้องแยกออกจากโทเค็นอื่นด้วยช่องว่าง

  • การเยื้องช่องว่างใช้เพื่อแสดงโครงสร้าง

  • แท็บไม่รวมอยู่ในการเยื้องสำหรับไฟล์ YAML

  • สมาชิกรายชื่อแสดงด้วยยัติภังค์นำหน้า (-).

  • สมาชิกรายชื่ออยู่ในวงเล็บเหลี่ยมและคั่นด้วยเครื่องหมายจุลภาค

  • อาร์เรย์ที่เชื่อมโยงจะแสดงโดยใช้เครื่องหมายจุดคู่ ( : )ในรูปแบบของคู่ค่าคีย์ พวกเขาอยู่ในวงเล็บปีกกา{}.

  • เอกสารหลายชุดที่มีสตรีมเดียวจะถูกคั่นด้วยขีดกลาง 3 ตัว (---)

  • โหนดที่ซ้ำกันในแต่ละไฟล์เริ่มต้นด้วยเครื่องหมายแอมเพอร์แซนด์ (&) และเครื่องหมายดอกจัน (*) ทำเครื่องหมายในภายหลัง

  • YAML ต้องการโคลอนและเครื่องหมายจุลภาคที่ใช้เป็นตัวคั่นรายการตามด้วยช่องว่างที่มีค่าสเกลาร์เสมอ

  • โหนดควรมีเครื่องหมายอัศเจรีย์ (!) หรือเครื่องหมายอัศเจรีย์คู่ (!!) ตามด้วยสตริงที่สามารถขยายเป็น URI หรือ URL

การเยื้องและการแยกเป็นแนวคิดหลักสองประการเมื่อคุณเรียนรู้ภาษาโปรแกรมใด ๆ บทนี้พูดถึงแนวคิดทั้งสองที่เกี่ยวข้องกับ YAML โดยละเอียด

เยื้อง YAML

YAML ไม่มีช่องว่างบังคับ นอกจากนี้ไม่จำเป็นต้องสอดคล้องกัน การเยื้อง YAML ที่ถูกต้องแสดงอยู่ด้านล่าง -

a:
   b:
      - c
      -  d
      - e
f:
      "ghi"
  • คุณควรจำกฎต่อไปนี้ในขณะที่ทำงานกับการเยื้องใน YAML: บล็อกโฟลว์ต้องมีช่องว่างอย่างน้อยบางส่วนที่มีระดับบล็อกปัจจุบันโดยรอบ

  • เนื้อหาโฟลว์ของ YAML ครอบคลุมหลายบรรทัด จุดเริ่มต้นของเนื้อหาโฟลว์เริ่มต้นด้วย{ หรือ [.

  • รายการบล็อกจะมีการเยื้องเช่นเดียวกับระดับบล็อกโดยรอบเนื่องจาก - ถือเป็นส่วนหนึ่งของการเยื้อง

ตัวอย่างของ Intended Block

สังเกตโค้ดต่อไปนี้ที่แสดงการเยื้องพร้อมตัวอย่าง -

--- !clarkevans.com/^invoice
invoice: 34843
date   : 2001-01-23
bill-to: &id001
   given  : Chris
   family : Dumars
   address:
      lines: |
            458 Walkman Dr.
            Suite #292
      city    : Royal Oak
      state   : MI
      postal  : 48046
ship-to: *id001
product:
    - sku         : BL394D
      quantity    : 4
      description : Basketball
      price       : 450.00
   - sku         : BL4438H
      quantity    : 1
      description : Super Hoop
      price       : 2392.00
tax  : 251.42
total: 4443.52
comments: >
    Late afternoon is best.
    Backup contact is Nancy
    Billsmer @ 338-4338.

การแยกสตริง

สตริงถูกแยกโดยใช้สตริงที่ยกมาสองครั้ง หากคุณหลีกเลี่ยงอักขระขึ้นบรรทัดใหม่ในสตริงที่กำหนดอักขระนั้นจะถูกลบและแปลเป็นค่าช่องว่างอย่างสมบูรณ์

ตัวอย่าง

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

-
 - Cat
 - Dog
 - Goldfish
-
 - Python
 - Lion
 - Tiger

อีกตัวอย่างหนึ่งในการอธิบายการแสดงสตริงใน YAML มีการกล่าวถึงด้านล่าง

errors:
      messages:
         already_confirmed: "was already confirmed, please try signing in"
         confirmation_period_expired: "needs to be confirmed within %{period}, please request a new one"
         expired: "has expired, please request a new one"
         not_found: "not found"
         not_locked: "was not locked"
         not_saved:
            one: "1 error prohibited this %{resource} from being saved:"
            other: "%{count} errors prohibited this %{resource} from being saved:"

ตัวอย่างนี้อ้างถึงชุดข้อความแสดงข้อผิดพลาดที่ผู้ใช้สามารถใช้ได้เพียงแค่กล่าวถึงประเด็นสำคัญและดึงค่าตามนั้น YAML รูปแบบนี้เป็นไปตามโครงสร้างของ JSON ซึ่งสามารถเข้าใจได้โดยผู้ใช้ที่เพิ่งเริ่มใช้ YAML

เมื่อคุณคุ้นเคยกับไวยากรณ์และพื้นฐานของ YAML แล้วให้เราดำเนินการต่อในรายละเอียดเพิ่มเติม ในบทนี้เราจะดูวิธีใช้ความคิดเห็นใน YAML

YAML supports single line comments. โครงสร้างของมันอธิบายไว้ด้านล่างด้วยความช่วยเหลือของตัวอย่าง -

# this is single line comment.

YAML does not support multi line comments. หากคุณต้องการแสดงความคิดเห็นสำหรับหลายบรรทัดคุณสามารถทำได้ดังที่แสดงในตัวอย่างด้านล่าง -

# this
# is a multiple
# line comment

คุณสมบัติของความคิดเห็น

คุณสมบัติของความคิดเห็นใน YAML แสดงไว้ด้านล่าง -

  • บล็อกที่แสดงความคิดเห็นถูกข้ามระหว่างการดำเนินการ

  • ความคิดเห็นช่วยเพิ่มคำอธิบายสำหรับบล็อกรหัสที่ระบุ

  • ความคิดเห็นต้องไม่ปรากฏในสเกลาร์

  • YAML ไม่รวมวิธีใด ๆ ในการหลีกเลี่ยงสัญลักษณ์แฮช (#) ดังนั้นภายในสตริงแบบหลายบรรทัดจึงไม่มีวิธีแบ่งข้อคิดเห็นจากค่าสตริงดิบ

ความคิดเห็นภายในคอลเลกชันแสดงอยู่ด้านล่าง -

key: #comment 1
   - value line 1
   #comment 2
   - value line 2
   #comment 3
   - value line 3

คีย์ลัดสำหรับการแสดงความคิดเห็นบล็อก YAML คือ Ctrl+Q.

หากคุณกำลังใช้ Sublime Text editorขั้นตอนในการแสดงความคิดเห็นเกี่ยวกับบล็อกดังต่อไปนี้ -

เลือกบล็อก ใช้“ CTRL + /” บน Linux และ Windows และ“ CMD + /” สำหรับระบบปฏิบัติการ Mac ดำเนินการบล็อก

โปรดทราบว่าขั้นตอนเดียวกันนี้สามารถใช้ได้หากคุณกำลังใช้ Visual Studio Code Editor. ขอแนะนำให้ใช้เสมอSublime Text Editor สำหรับการสร้างไฟล์ YAML เนื่องจากระบบปฏิบัติการส่วนใหญ่รองรับและรวมถึงปุ่มลัดที่เป็นมิตรกับนักพัฒนาซอฟต์แวร์

YAML รวมบล็อกคอลเลกชันที่ใช้การเยื้องสำหรับขอบเขต ที่นี่แต่ละรายการเริ่มต้นด้วยบรรทัดใหม่ ลำดับบล็อกในคอลเลกชันระบุแต่ละรายการด้วยไฟล์dash and space(-). ใน YAML รูปแบบบล็อกคอลเลกชันจะไม่แสดงด้วยตัวบ่งชี้เฉพาะใด ๆ การรวบรวมบล็อกใน YAML สามารถแยกความแตกต่างจากปริมาณสเกลาร์อื่น ๆ ด้วยการระบุคู่ค่าคีย์ที่รวมอยู่ในนั้น

การแมปเป็นการแสดงค่าคีย์ที่รวมอยู่ในโครงสร้าง JSON มักใช้ในระบบสนับสนุนหลายภาษาและการสร้าง API ในแอปพลิเคชันมือถือ การแมปใช้การแทนค่าคู่คีย์ด้วยการใช้colon and space (:).

ตัวอย่าง

พิจารณาตัวอย่างลำดับของสเกลาร์เช่นรายชื่อผู้เล่นบอลดังที่แสดงด้านล่าง -

- Mark Joseph
- James Stephen
- Ken Griffey

ตัวอย่างต่อไปนี้แสดงการแมปสเกลาร์กับสเกลาร์ -

hr: 87
avg: 0.298
rbi: 149

ตัวอย่างต่อไปนี้แสดงการแม็ปสเกลาร์กับลำดับ -

European:
- Boston Red Sox
- Detroit Tigers
- New York Yankees

national:
- New York Mets
- Chicago Cubs
- Atlanta Braves

คอลเลกชันสามารถใช้สำหรับการแม็พลำดับซึ่งแสดงไว้ด้านล่าง -

-
   name: Mark Joseph
   hr: 87
   avg: 0.278
-
   name: James Stephen
   hr: 63
   avg: 0.288

ด้วยคอลเล็กชัน YAML จะรวมสไตล์การไหลโดยใช้ตัวบ่งชี้ที่ชัดเจนแทนที่จะใช้การเยื้องเพื่อแสดงช่องว่าง ลำดับการไหลในคอลเลกชันถูกเขียนเป็นรายการที่คั่นด้วยเครื่องหมายจุลภาคที่อยู่ในวงเล็บเหลี่ยม ภาพประกอบที่ดีที่สุดสำหรับการรวบรวมซึ่งรวมอยู่ในเฟรมเวิร์ก PHP เช่นซิมโฟนี

[PHP, Perl, Python]

คอลเลกชันเหล่านี้ถูกเก็บไว้ในเอกสาร การแยกเอกสารใน YAML จะแสดงด้วยขีดกลางสามขีดหรือขีดกลาง (---) ท้ายเอกสารมีจุดสามจุด (…)

การแยกเอกสารใน YAML แสดงด้วยเครื่องหมายขีดกลางสามขีด (---) ส่วนท้ายของเอกสารแสดงด้วยจุดสามจุด (…)

การแสดงเอกสารเรียกว่ารูปแบบโครงสร้างซึ่งระบุไว้ด้านล่าง -

# Ranking of 1998 home runs
---
- Mark Joseph
- James Stephen
- Ken Griffey 

# Team ranking
---
- Chicago Cubs
- St Louis Cardinals

เครื่องหมายคำถามที่มีช่องว่างรวมกันบ่งบอกถึงการทำแผนที่ที่ซับซ้อนในโครงสร้าง ภายในคอลเลกชันบล็อกผู้ใช้สามารถรวมโครงสร้างที่มีขีดกลางโคลอนและเครื่องหมายคำถาม ตัวอย่างต่อไปนี้แสดงการแม็ประหว่างลำดับ -

- 2001-07-23
? [ New York Yankees,Atlanta Braves ]
: [ 2001-07-02, 2001-08-12, 2001-08-14]

สเกลาร์ใน YAML เขียนในรูปแบบบล็อกโดยใช้ประเภทตัวอักษรซึ่งแสดงเป็น (|). หมายถึงการนับเส้นแบ่ง ใน YAML สเกลาร์เขียนแบบพับ (>) โดยแต่ละบรรทัดหมายถึงพื้นที่พับซึ่งลงท้ายด้วย empty line หรือ more indented ไลน์.

บรรทัดใหม่จะถูกเก็บรักษาไว้ในตัวอักษรดังแสดงด้านล่าง -

ASCII Art
--- |
\//||\/||
// || ||__

บรรทัดใหม่ที่พับแล้วจะถูกเก็บรักษาไว้สำหรับ more indented lines และ blank lines ดังแสดงด้านล่าง -

>
Sammy Sosa completed another
fine season with great stats.
63 Home Runs
0.288 Batting Average
What a year!

สเกลาร์โฟลว์ YAML ประกอบด้วยรูปแบบธรรมดาและสไตล์ที่ยกมา รูปแบบที่ยกมาสองครั้งประกอบด้วยลำดับการหลบหนีต่างๆ Flow scalars สามารถรวมหลายบรรทัด การแบ่งบรรทัดจะถูกพับในโครงสร้างนี้เสมอ

plain:
This unquoted scalar
spans many lines.
quoted: "So does this
quoted scalar.\n"

ใน YAML โหนดที่ไม่ได้ติดแท็กจะถูกระบุด้วยประเภทเฉพาะของแอปพลิเคชัน ตัวอย่างของข้อกำหนดแท็กโดยทั่วไปใช้seq, map และ strประเภทสำหรับที่เก็บแท็ก YAML แท็กจะแสดงเป็นตัวอย่างที่กล่าวถึงด้านล่าง -

แท็กจำนวนเต็ม

แท็กเหล่านี้มีค่าจำนวนเต็มอยู่ด้วย เรียกอีกอย่างว่าแท็กตัวเลข

canonical: 12345
decimal: +12,345
sexagecimal: 3:25:45
octal: 014
hexadecimal: 0xC

ตัวเลขจุดลอย

แท็กเหล่านี้ประกอบด้วยค่าทศนิยมและเลขชี้กำลัง พวกเขาเรียกอีกอย่างว่าแท็กเลขชี้กำลัง

canonical: 1.23015e+3
exponential: 12.3015e+02
sexagecimal: 20:30.15
fixed: 1,230.15
negative infinity: -.inf
not a number: .NaN

แท็กเบ็ดเตล็ด

ประกอบด้วยจำนวนเต็มค่าลอยตัวและค่าสตริงที่ฝังอยู่ในค่าเหล่านี้ ดังนั้นจึงเรียกว่าแท็กเบ็ดเตล็ด

null: ~
true: y
false: n
string: '12345'

ตัวอย่างความยาวเต็มต่อไปนี้ระบุโครงสร้างของ YAML ซึ่งรวมถึงสัญลักษณ์และการแสดงต่างๆซึ่งจะเป็นประโยชน์ในขณะแปลงหรือประมวลผลในรูปแบบ JSON แอตทริบิวต์เหล่านี้เรียกอีกอย่างว่าชื่อคีย์ในเอกสาร JSON สัญกรณ์เหล่านี้สร้างขึ้นเพื่อความปลอดภัย

รูปแบบ YAML ด้านบนแสดงถึงแอตทริบิวต์ต่างๆของค่าดีฟอลต์อะแดปเตอร์และโฮสต์ที่มีแอตทริบิวต์อื่น ๆ YAML ยังเก็บบันทึกของทุกไฟล์ที่สร้างขึ้นซึ่งจะรักษาการติดตามข้อความแสดงข้อผิดพลาดที่สร้างขึ้น ในการแปลงไฟล์ YAML ที่ระบุในรูปแบบ JSON เราจะได้ผลลัพธ์ที่ต้องการดังที่กล่าวไว้ด้านล่าง -

defaults: &defaults
   adapter:  postgres
   host:     localhost

development:
   database: myapp_development
   <<: *defaults

test:
   database: myapp_test
   <<: *defaults

มาแปลง YAML เป็นรูปแบบ JSON และตรวจสอบผลลัพธ์

{
   "defaults": {
      "adapter": "postgres",
      "host": "localhost"
   },
   "development": {
      "database": "myapp_development",
      "adapter": "postgres",
      "host": "localhost"
   },
   "test": {
      "database": "myapp_test",
      "adapter": "postgres",
      "host": "localhost"
   }
}

คีย์เริ่มต้นที่มีคำนำหน้า“ <<: *” จะรวมอยู่ในและเมื่อจำเป็นโดยไม่จำเป็นต้องเขียนข้อมูลโค้ดเดิมซ้ำ ๆ

YAML ทำตามขั้นตอนมาตรฐานสำหรับโฟลว์กระบวนการ โครงสร้างข้อมูลดั้งเดิมใน YAML ประกอบด้วยการนำเสนออย่างง่ายเช่นโหนด เรียกอีกอย่างว่าแทนโหนดกราฟ

ซึ่งรวมถึงการแม็ปลำดับและปริมาณสเกลาร์ซึ่งกำลังถูกทำให้เป็นอนุกรมเพื่อสร้างแผนภูมิการทำให้เป็นอนุกรม ด้วยการทำให้เป็นอนุกรมวัตถุจะถูกแปลงด้วยกระแสของไบต์

แผนผังเหตุการณ์การทำให้เป็นอนุกรมช่วยในการสร้างการนำเสนอของสตรีมอักขระดังที่แสดงในแผนภาพต่อไปนี้

โพรซีเดอร์ย้อนกลับแยกวิเคราะห์สตรีมของไบต์ในแผนผังเหตุการณ์ที่ต่อเนื่องกัน ต่อมาโหนดจะถูกแปลงเป็นกราฟโหนด ค่าเหล่านี้จะถูกแปลงในโครงสร้างข้อมูลดั้งเดิมของ YAML ในภายหลัง รูปด้านล่างอธิบายสิ่งนี้ -

ข้อมูลใน YAML ใช้สองวิธี: machine processing และ human consumption. โปรเซสเซอร์ใน YAML ถูกใช้เป็นเครื่องมือสำหรับขั้นตอนการแปลงข้อมูลระหว่างมุมมองเสริมในแผนภาพที่ให้ไว้ข้างต้น บทนี้อธิบายโครงสร้างข้อมูลที่โปรเซสเซอร์ YAML ต้องจัดเตรียมไว้ภายในแอปพลิเคชันที่กำหนด

YAML มีขั้นตอนการทำให้เป็นอนุกรมสำหรับการแสดงวัตถุข้อมูลในรูปแบบอนุกรม การประมวลผลข้อมูล YAML ประกอบด้วยสามขั้นตอน:Representation, Serialization, Presentation and parsing. ให้เราคุยรายละเอียดแต่ละเรื่อง

การเป็นตัวแทน

YAML แสดงโครงสร้างข้อมูลโดยใช้โหนดสามประเภท: sequence, mapping และ scalar.

ลำดับ

ลำดับหมายถึงจำนวนรายการที่เรียงลำดับซึ่งแมปการเชื่อมโยงที่ไม่เรียงลำดับของคู่ค่าคีย์ สอดคล้องกับรายการอาร์เรย์ Perl หรือ Python

โค้ดที่แสดงด้านล่างเป็นตัวอย่างของการแสดงลำดับ -

product:
   - sku         : BL394D
     quantity    : 4
     description : Football
     price       : 450.00
   - sku         : BL4438H
     quantity    : 1
     description : Super Hoop
     price       : 2392.00

การทำแผนที่

การแมปในทางกลับกันแสดงถึงโครงสร้างข้อมูลพจนานุกรมหรือตารางแฮช ตัวอย่างเช่นเดียวกันได้กล่าวไว้ด้านล่าง -

batchLimit: 1000
threadCountLimit: 2
key: value
keyMapping: <What goes here?>

สเกลาร์

สเกลาร์แสดงถึงค่ามาตรฐานของสตริงจำนวนเต็มวันที่และชนิดข้อมูลอะตอม โปรดทราบว่า YAML ยังรวมถึงโหนดที่ระบุโครงสร้างชนิดข้อมูล สำหรับข้อมูลเพิ่มเติมเกี่ยวกับสเกลาร์โปรดดูบทที่ 6 ของบทช่วยสอนนี้

การทำให้เป็นอนุกรม

ขั้นตอนการทำให้เป็นอนุกรมเป็นสิ่งจำเป็นใน YAML ที่ช่วยลดลำดับคีย์ที่เป็นมิตรกับมนุษย์และชื่อจุดยึด ผลลัพธ์ของการทำให้เป็นอนุกรมคือแผนผังการทำให้เป็นอนุกรม YAML สามารถส่งผ่านเพื่อสร้างชุดการเรียกเหตุการณ์ของข้อมูล YAML

ตัวอย่างสำหรับการทำให้เป็นอนุกรมได้รับด้านล่าง -

consumer:
   class: 'AppBundle\Entity\consumer'
   attributes:
      filters: ['customer.search', 'customer.order', 'customer.boolean']
   collectionOperations:
      get:
         method: 'GET'
         normalization_context:
       groups: ['customer_list']
   itemOperations:
      get:
         method: 'GET'
         normalization_context:
            groups: ['customer_get']

การนำเสนอ

ผลลัพธ์สุดท้ายของการทำให้เป็นอนุกรม YAML เรียกว่าการนำเสนอ แสดงถึงกระแสของตัวละครในลักษณะที่เป็นมิตรกับมนุษย์ โปรเซสเซอร์ YAML ประกอบด้วยรายละเอียดการนำเสนอต่างๆสำหรับการสร้างสตรีมการจัดการการเยื้องและการจัดรูปแบบเนื้อหา กระบวนการที่สมบูรณ์นี้ได้รับคำแนะนำจากความชอบของผู้ใช้

ตัวอย่างสำหรับกระบวนการนำเสนอ YAML คือผลลัพธ์ของค่า JSON ที่สร้างขึ้น สังเกตรหัสที่ระบุด้านล่างเพื่อความเข้าใจที่ดีขึ้น -

{
   "consumer": {
      "class": "AppBundle\\Entity\\consumer",
      "attributes": {
         "filters": [
            "customer.search",
            "customer.order",
            "customer.boolean"
         ]
      },
      "collectionOperations": {
         "get": {
            "method": "GET",
            "normalization_context": {
               "groups": [
                  "customer_list"
               ]
            }
         }
      },
      "itemOperations": {
         "get": {
            "method": "GET",
            "normalization_context": {
               "groups": [
                  "customer_get"
               ]
            }
         }
      }
   }
}

การแยกวิเคราะห์

การแยกวิเคราะห์เป็นกระบวนการที่ผกผันของการนำเสนอ ประกอบด้วยสตรีมของตัวละครและสร้างชุดเหตุการณ์ จะทิ้งรายละเอียดที่แนะนำในกระบวนการนำเสนอซึ่งทำให้เกิดเหตุการณ์การทำให้เป็นอนุกรม ขั้นตอนการแยกวิเคราะห์อาจล้มเหลวเนื่องจากอินพุตที่ไม่ถูกต้อง โดยพื้นฐานแล้วเป็นขั้นตอนในการตรวจสอบว่า YAML มีรูปแบบที่ดีหรือไม่

ลองพิจารณาตัวอย่าง YAML ซึ่งระบุไว้ด้านล่าง -

---
   environment: production
   classes:
      nfs::server:
         exports:
            - /srv/share1
            - /srv/share3
   parameters:
      paramter1

ด้วยขีดกลางสามตัวแสดงถึงจุดเริ่มต้นของเอกสารที่มีแอตทริบิวต์ต่างๆที่กำหนดไว้ในภายหลัง

YAML lint เป็นตัวแยกวิเคราะห์ออนไลน์ของ YAML และช่วยในการแยกวิเคราะห์โครงสร้าง YAML เพื่อตรวจสอบว่าถูกต้องหรือไม่ ลิงก์อย่างเป็นทางการสำหรับผ้าสำลี YAML ระบุไว้ด้านล่าง:http://www.yamllint.com/

คุณสามารถดูผลลัพธ์ของการแยกวิเคราะห์ดังที่แสดงด้านล่าง -

บทนี้จะอธิบายรายละเอียดเกี่ยวกับขั้นตอนและกระบวนการที่เรากล่าวถึงในบทที่แล้ว แบบจำลองข้อมูลใน YAML จะระบุคุณลักษณะของการทำให้เป็นอนุกรมและขั้นตอนการนำเสนอในรูปแบบที่เป็นระบบโดยใช้แผนภาพเฉพาะ

สำหรับโมเดลข้อมูลสิ่งสำคัญคือต้องแสดงข้อมูลแอพพลิเคชั่นที่พกพาได้ระหว่างสภาพแวดล้อมการเขียนโปรแกรม

แผนภาพที่แสดงด้านบนแสดงถึงแบบจำลองข้อมูลปกติซึ่งแสดงในรูปแบบกราฟ ใน YAML การแสดงข้อมูลเนทีฟจะรูทเชื่อมต่อและกำกับกราฟของโหนดที่ติดแท็ก หากเรากล่าวถึงกราฟที่กำหนดทิศทางจะมีชุดของโหนดที่มีกราฟกำกับ ตามที่กล่าวไว้ในรูปแบบข้อมูล YAML รองรับโหนดสามชนิด ได้แก่ -

  • Sequences
  • Scalars
  • Mappings

คำจำกัดความพื้นฐานของโหนดการแสดงเหล่านี้ถูกกล่าวถึงในบทสุดท้าย ในบทนี้เราจะเน้นไปที่แผนผังของคำเหล่านี้ แผนภาพลำดับต่อไปนี้แสดงถึงขั้นตอนการทำงานของตำนานที่มีแท็กและโหนดการแมปประเภทต่างๆ

โหนดมีสามประเภท: sequence node, scalar node และ mapping node.

ลำดับ

โหนดลำดับเป็นไปตามสถาปัตยกรรมแบบลำดับและรวมชุดลำดับของโหนดศูนย์ขึ้นไป ลำดับ YAML อาจมีโหนดเดียวกันซ้ำ ๆ กันหรือโหนดเดียว

สเกลาร์

เนื้อหาของสเกลาร์ใน YAML ประกอบด้วยอักขระ Unicode ซึ่งสามารถแสดงในรูปแบบด้วยชุดของศูนย์ โดยทั่วไปสเกลาร์โหนดจะมีปริมาณสเกลาร์

การทำแผนที่

โหนดการแม็พมีการแทนค่าคู่คีย์ เนื้อหาของโหนดการแมปประกอบด้วยการรวมกันของคู่คีย์ - ค่าที่มีเงื่อนไขบังคับว่าชื่อคีย์ควรจะไม่ซ้ำกัน ลำดับและการแมปรวมกันเป็นคอลเลกชัน

โปรดทราบว่าตามที่แสดงในแผนภาพที่แสดงด้านบนสเกลาร์ลำดับและการแมปจะแสดงในรูปแบบที่เป็นระบบ

อักขระประเภทต่างๆใช้สำหรับฟังก์ชันต่างๆ บทนี้พูดถึงรายละเอียดเกี่ยวกับไวยากรณ์ที่ใช้ใน YAML และมุ่งเน้นไปที่การจัดการอักขระ

อักขระตัวบ่งชี้

อักขระตัวบ่งชี้รวมถึงความหมายพิเศษที่ใช้อธิบายเนื้อหาของเอกสาร YAML ตารางต่อไปนี้แสดงรายละเอียดนี้

ซีเนียร์ ตัวละครและการทำงาน
1

_

หมายถึงรายการลำดับบล็อก

2

?

หมายถึงคีย์การแมป

3

:

หมายถึงค่าการแมป

4

,

หมายถึงรายการคอลเลกชันการไหล

5

[

เริ่มลำดับการไหล

6

]

สิ้นสุดลำดับการไหล

7

{

เริ่มต้นการแม็ปโฟลว์

8

}

สิ้นสุดการแมปโฟลว์

9

#

มันแสดงถึงความคิดเห็น

10

&

หมายถึงคุณสมบัติจุดยึดของโหนด

11

*

หมายถึงโหนดนามแฝง

12

!

หมายถึงแท็กของโหนด

13

|

หมายถึงสเกลาร์บล็อกตามตัวอักษร

14

>

หมายถึงสเกลาร์บล็อกพับ

15

`

อัญประกาศเดี่ยวล้อมรอบสเกลาร์โฟลว์ที่ยกมา

16

"

อัญประกาศคู่ล้อมรอบสเกลาร์โฟลว์ที่ยกมาสองครั้ง

17

%

หมายถึงคำสั่งที่ใช้

ตัวอย่างต่อไปนี้แสดงอักขระที่ใช้ในไวยากรณ์ -

%YAML 1.1
---
!!map {
   ? !!str "sequence"
   : !!seq [
      !!str "one", !!str "two"
   ],
   ? !!str "mapping"
   : !!map {
      ? !!str "sky" : !!str "blue",
      ? !!str "sea" : !!str "green",
   }
}

# This represents
# only comments.
---
!!map1 {
   ? !!str "anchored"
   : !local &A1 "value",
   ? !!str "alias"
   : *A1,
}
!!str "text"

ในบทนี้คุณจะได้เรียนรู้เกี่ยวกับลักษณะพื้นฐานของไวยากรณ์ใน YAML -

  • พารามิเตอร์การผลิต
  • ช่องว่างเยื้อง
  • พื้นที่แยก
  • คำนำหน้าบรรทัดที่ละเว้น
  • การพับเส้น

ให้เราเข้าใจรายละเอียดในแต่ละด้าน

พารามิเตอร์การผลิต

พารามิเตอร์การผลิตประกอบด้วยชุดพารามิเตอร์และช่วงของค่าที่อนุญาตซึ่งใช้ในการผลิตเฉพาะ รายการพารามิเตอร์การผลิตต่อไปนี้ใช้ใน YAML -

เยื้อง

แสดงโดยอักขระ n หรือ mสตรีมตัวละครขึ้นอยู่กับระดับการเยื้องของบล็อกที่รวมอยู่ในนั้น การผลิตจำนวนมากได้กำหนดคุณลักษณะเหล่านี้

บริบท

แสดงโดย c. YAML รองรับบริบทสองกลุ่ม:block styles และ flow styles.

สไตล์

แสดงโดย s เนื้อหาสเกลาร์อาจนำเสนอในหนึ่งในห้ารูปแบบ:plain, double quoted and single quoted flow, literal and folded block.

ชมปิง

แสดงโดย t. บล็อกสเกลาร์มีกลไกมากมายที่ช่วยในการตัดแต่งบล็อก:strip, clip และ keep. Chomping ช่วยในการจัดรูปแบบสตริงบรรทัดใหม่ ใช้การแสดงลักษณะบล็อก กระบวนการ Chomping เกิดขึ้นด้วยความช่วยเหลือของตัวชี้วัด อินดิเคเตอร์จะควบคุมว่าเอาต์พุตใดที่ควรสร้างด้วยสตริงใหม่ บรรทัดใหม่จะถูกลบออกด้วย(-) มีการเพิ่มตัวดำเนินการและบรรทัดใหม่ด้วย (+) ตัวดำเนินการ

ตัวอย่างสำหรับกระบวนการ chomping แสดงไว้ด้านล่าง -

strip: |-
   text↓
clip: |
   text↓
keep: |+
   text↓

ผลลัพธ์หลังจากแยกวิเคราะห์ตัวอย่าง YAML ที่ระบุมีดังนี้ -

ช่องว่างเยื้อง

ในสตรีมอักขระ YAML การเยื้องถูกกำหนดให้เป็นอักขระตัวแบ่งบรรทัดด้วยอักขระศูนย์ขึ้นไป จุดสำคัญที่สุดที่ควรคำนึงถึงคือการเยื้องต้องไม่มีอักขระแท็บใด ๆ อักขระในการเยื้องไม่ควรถือเป็นส่วนหนึ่งของข้อมูลเนื้อหาของโหนด ปฏิบัติตามรหัสต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

%YAML 1.1
---
!!map {
   ? !!str "Not indented"
   : !!map {
      ? !!str "By one space"
      : !!str "By four\n spaces\n",
      ? !!str "Flow style"
      : !!seq [
         !!str "By two",
         !!str "Still by two",
         !!str "Again by two",
      ]
   }
}

ผลลัพธ์ที่คุณสามารถเห็นได้หลังจากการเยื้องมีดังนี้ -

{
   "Not indented": {
      "By one space": "By four\n spaces\n", 
      "Flow style": [
         "By two", 
         "Still by two", 
         "Again by two"
      ]
   }
}

พื้นที่แยก

YAML ใช้อักขระเว้นวรรคเพื่อแยกระหว่างโทเค็น ข้อสังเกตที่สำคัญที่สุดคือการแยกใน YAML ไม่ควรมีอักขระแท็บ

รหัสเดียวต่อไปนี้แสดงการใช้ช่องว่างการแยก -

{ · first: · Sammy, · last: · Sosa · }
{
   "\u00b7 last": "\u00b7 Sosa \u00b7", 
   "\u00b7 first": "\u00b7 Sammy"
}

คำนำหน้าบรรทัดที่ละเว้น

คำนำหน้าว่างจะมีการเยื้องเสมอโดยขึ้นอยู่กับประเภทสเกลาร์ซึ่งรวมถึงช่องว่างนำหน้าด้วย สเกลาร์ธรรมดาไม่ควรมีอักขระแท็บ ในทางกลับกันสเกลาร์ที่ยกมาอาจมีอักขระแท็บ บล็อกสเกลาร์โดยสมบูรณ์ขึ้นอยู่กับการเยื้อง

ตัวอย่างต่อไปนี้แสดงการทำงานของคำนำหน้าบรรทัดที่ละเว้นอย่างเป็นระบบ -

%YAML 1.1
---
!!map {
   ? !!str "plain"
   : !!str "text lines",
   ? !!str "quoted"
   : !!str "text lines",
   ? !!str "block"
   : !!str "text·®lines\n"
}

ผลลัพธ์ที่ได้สำหรับสตรีมบล็อกมีดังนี้ -

{
   "plain": "text lines", 
   "quoted": "text lines", 
   "block": "text\u00b7\u00aelines\n"
}

สายพับ

Line Folding ช่วยให้สามารถทำลายเส้นยาว ๆ เพื่อให้อ่านง่าย จำนวนบรรทัดสั้นมากขึ้นหมายถึงการอ่านที่ดีขึ้น การพับเส้นทำได้โดยการสังเกตความหมายดั้งเดิมของสายยาว ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการพับเส้น -

%YAML 1.1
--- !!str
"specific\L\
trimmed\n\n\n\
as space"

คุณสามารถดูผลลัพธ์ของการพับบรรทัดในรูปแบบ JSON ได้ดังนี้ -

"specific\u2028trimmed\n\n\nas space"

ใน YAML คุณพบสตรีมตัวละครต่างๆดังนี้ -

  • Directives
  • เครื่องหมายขอบเขตเอกสาร
  • Documents
  • สตรีมสมบูรณ์

ในบทนี้เราจะพูดถึงรายละเอียด

คำสั่ง

Directives คือคำสั่งพื้นฐานที่ใช้ในโปรเซสเซอร์ YAML คำสั่งคือรายละเอียดการนำเสนอเช่นความคิดเห็นที่ไม่สะท้อนให้เห็นในแผนผังลำดับข้อมูล ใน YAML ไม่มีวิธีกำหนดคำสั่งส่วนตัว ส่วนนี้จะกล่าวถึงคำสั่งประเภทต่างๆพร้อมตัวอย่างที่เกี่ยวข้อง -

คำสั่งที่สงวนไว้

คำสั่งที่สงวนไว้จะเริ่มต้นด้วยอักขระยัติภังค์สามตัว (---) ดังที่แสดงในตัวอย่างด้านล่าง คำสั่งที่สงวนไว้จะถูกแปลงเป็นค่าเฉพาะของ JSON

%YAML 1.1
--- !!str
"foo"

คำสั่ง YAML

YAML Directives เป็นคำสั่งเริ่มต้น หากแปลงเป็น JSON ค่าที่ดึงมาจะรวมอักขระสแลชข้างหน้าในอักขระที่นำหน้าและสิ้นสุด

%YAML 1.1
---
!!str "foo"

เครื่องหมายขอบเขตเอกสาร

YAML ใช้เครื่องหมายเหล่านี้เพื่ออนุญาตให้มีเอกสารมากกว่าหนึ่งฉบับในสตรีมเดียว เครื่องหมายเหล่านี้ใช้เพื่อสื่อถึงโครงสร้างของเอกสาร YAML โดยเฉพาะ โปรดสังเกตว่าบรรทัดที่ขึ้นต้นด้วย“ ---“ ใช้เพื่อเริ่มเอกสารใหม่

รหัสต่อไปนี้อธิบายเกี่ยวกับเรื่องนี้พร้อมตัวอย่าง -

%YAML 1.1
---
!!str "foo"
%YAML 1.1
---
!!str "bar"
%YAML 1.1
---
!!str "baz"

เอกสาร

เอกสาร YAML ถือเป็นโครงสร้างข้อมูลเนทีฟเดียวที่นำเสนอเป็นโหนดรูทเดียว รายละเอียดการนำเสนอในเอกสาร YAML เช่นคำสั่งความคิดเห็นการเยื้องและรูปแบบจะไม่ถือเป็นเนื้อหาที่รวมอยู่ในเอกสารเหล่านี้

เอกสารที่ใช้ใน YAML มีสองประเภท มีคำอธิบายในส่วนนี้ -

เอกสารที่ชัดเจน

เริ่มต้นด้วยเครื่องหมายเริ่มต้นเอกสารตามด้วยการนำเสนอโหนดรูท ตัวอย่างของการประกาศอย่างชัดเจนของ YAML มีให้ด้านล่าง -

---

some: yaml

...

ประกอบด้วยเครื่องหมายจุดเริ่มต้นและจุดสิ้นสุดที่ชัดเจนซึ่ง ได้แก่ “ ---“ และ“ …” ในตัวอย่างที่กำหนด ในการแปลง YAML ที่ระบุในรูปแบบ JSON เราจะได้ผลลัพธ์ตามที่แสดงด้านล่าง -

{
   "some": "yaml"
}

เอกสารโดยปริยาย

เอกสารเหล่านี้ไม่ได้ขึ้นต้นด้วยเครื่องหมายเริ่มต้นเอกสาร สังเกตรหัสที่ระบุด้านล่าง -

fruits:
   - Apple
   - Orange
   - Pineapple
   - Mango

การแปลงค่าเหล่านี้ในรูปแบบ JSON เราได้ผลลัพธ์เป็นออบเจ็กต์ JSON อย่างง่ายดังที่ระบุด้านล่าง -

{
   "fruits": [
      "Apple",
      "Orange",
      "Pineapple",
      "Mango"
   ]
}

สตรีมสมบูรณ์

YAML มีลำดับของไบต์ที่เรียกว่าสตรีมอักขระ สตรีมเริ่มต้นด้วยคำนำหน้าที่มีลำดับไบต์แสดงถึงการเข้ารหัสอักขระ สตรีมที่สมบูรณ์เริ่มต้นด้วยคำนำหน้าที่มีการเข้ารหัสอักขระตามด้วยความคิดเห็น

ตัวอย่างสตรีมที่สมบูรณ์ (สตรีมอักขระ) แสดงอยู่ด้านล่าง -

%YAML 1.1
---
!!str "Text content\n"

โหนดการนำเสนอแต่ละโหนดมีลักษณะสำคัญสองประการที่เรียกว่า anchor และ tag. คุณสมบัติโหนดอาจถูกระบุด้วยเนื้อหาโหนดโดยละเว้นจากสตรีมอักขระ

ตัวอย่างพื้นฐานของการแสดงโหนดมีดังนี้ -

%YAML 1.1
---
!!map {
   ? &A1 !!str "foo"
   : !!str "bar",
   ? !!str &A2 "baz"
   : *a1
}

จุดยึดโหนด

คุณสมบัติจุดยึดแทนโหนดสำหรับการอ้างอิงในอนาคต สตรีมอักขระของการเป็นตัวแทน YAML ในโหนดแสดงด้วยนามสกุลampersand (&)ตัวบ่งชี้. โปรเซสเซอร์ YAML ไม่จำเป็นต้องเก็บรักษาชื่อจุดยึดพร้อมกับรายละเอียดการแสดงที่ประกอบอยู่ รหัสต่อไปนี้อธิบายสิ่งนี้ -

%YAML 1.1
---
!!map {
   ? !!str "First occurence"
   : &A !!str "Value",
   ? !!str "Second occurence"
   : *A
}

ผลลัพธ์ของ YAML ที่สร้างด้วยโหนดจุดยึดแสดงอยู่ด้านล่าง -

---
!!map {
   ? !!str "First occurence"
   : !!str "Value",
   ? !!str "Second occurence"
   : !!str "Value",
}

แท็กโหนด

คุณสมบัติแท็กแสดงถึงประเภทของโครงสร้างข้อมูลเนทีฟซึ่งกำหนดโหนดอย่างสมบูรณ์ แท็กแสดงด้วยเครื่องหมาย (!) ตัวบ่งชี้ แท็กถือเป็นส่วนหนึ่งของกราฟการแสดง ตัวอย่างต่อไปนี้ของการอธิบายแท็กโหนดโดยละเอียด -

%YAML 1.1
---
!!map {
   ? !<tag:yaml.org,2002:str> "foo"
   : !<!bar> "baz"
}

เนื้อหาโหนด

เนื้อหาโหนดสามารถแสดงในเนื้อหาโฟลว์หรือรูปแบบบล็อก เนื้อหาที่ถูกบล็อกจะขยายไปถึงจุดสิ้นสุดของบรรทัดและใช้การเยื้องเพื่อแสดงโครงสร้าง คอลเลกชันแต่ละชนิดสามารถแสดงในรูปแบบคอลเลกชั่นโฟลว์เดียวที่เฉพาะเจาะจงหรือสามารถพิจารณาเป็นบล็อกเดียว รหัสต่อไปนี้อธิบายโดยละเอียด -

%YAML 1.1
---
!!map {
   ? !!str "foo"
   : !!str "bar baz"
}

%YAML 1.1
---
!!str "foo bar"

%YAML 1.1
---
!!str "foo bar"

%YAML 1.1
---
!!str "foo bar\n"

ในบทนี้เราจะเน้นไปที่ประเภทสเกลาร์ต่างๆซึ่งใช้สำหรับแสดงเนื้อหา ใน YAML ความคิดเห็นอาจนำหน้าหรือติดตามเนื้อหาสเกลาร์ สิ่งสำคัญคือต้องทราบว่าไม่ควรรวมความคิดเห็นไว้ในเนื้อหาสเกลาร์

โปรดทราบว่าสไตล์สเกลาร์โฟลว์ทั้งหมดสามารถรวมได้หลายบรรทัดยกเว้นการใช้งานในหลายคีย์

การแสดงสเกลาร์แสดงไว้ด้านล่าง -

%YAML 1.1
---
!!map {
   ? !!str "simple key"
   : !!map {
      ? !!str "also simple"
      : !!str "value",
      ? !!str "not a simple key"
      : !!str "any value"
   }
}

ผลลัพธ์ที่สร้างขึ้นของส่วนหัวสเกลาร์บล็อกแสดงไว้ด้านล่าง -

{
   "simple key": {
      "not a simple key": "any value", 
      "also simple": "value"
   }
}

Document Marker Scalar เนื้อหา

อักขระทั้งหมดในตัวอย่างนี้ถือเป็นเนื้อหารวมถึงอักขระช่องว่างภายใน

%YAML 1.1
---
!!map {
   ? !!str "---"
   : !!str "foo",
   ? !!str "...",
   : !!str "bar"
}

%YAML 1.1
---
!!seq [
   !!str "---",
   !!str "...",
   !!map {
      ? !!str "---"
      : !!str "..."
   }
]

การแบ่งบรรทัดธรรมดาจะแสดงด้วยตัวอย่างด้านล่าง -

%YAML 1.1
---
!!str "as space \
trimmed\n\
specific\L\n\
none"

เอาต์พุต JSON ที่สอดคล้องกันสำหรับสิ่งเดียวกันมีการระบุไว้ด้านล่าง -

"as space trimmed\nspecific\u2028\nnone"

รูปแบบโฟลว์ใน YAML สามารถคิดได้ว่าเป็นส่วนขยายของ JSON ตามธรรมชาติเพื่อให้ครอบคลุมบรรทัดเนื้อหาแบบพับเพื่อให้อ่านได้ง่ายขึ้นซึ่งใช้จุดยึดและนามแฝงเพื่อสร้างอินสแตนซ์ออบเจ็กต์ ในบทนี้เราจะมุ่งเน้นไปที่การแสดงกระแสของแนวคิดต่อไปนี้ -

  • โหนดนามแฝง
  • โหนดว่าง
  • รูปแบบ Flow Scalar
  • รูปแบบการรวบรวมกระแส
  • โหนดการไหล

ตัวอย่างของโหนดนามแฝงแสดงไว้ด้านล่าง -

%YAML 1.2
---
!!map {
   ? !!str "First occurrence"
   : &A !!str "Foo",
   ? !!str "Override anchor"
   : &B !!str "Bar",
   ? !!str "Second occurrence"
   : *A,
   ? !!str "Reuse anchor"
   : *B,
}

เอาต์พุต JSON ของโค้ดที่ระบุด้านบนแสดงไว้ด้านล่าง -

{
   "First occurrence": "Foo", 
   "Second occurrence": "Foo", 
   "Override anchor": "Bar", 
   "Reuse anchor": "Bar"
}

โหนดที่มีเนื้อหาว่างถือเป็นโหนดว่าง ตัวอย่างต่อไปนี้แสดงสิ่งนี้ -

%YAML 1.2
---
!!map {
   ? !!str "foo" : !!str "",
   ? !!str "" : !!str "bar",
}

ผลลัพธ์ของโหนดว่างใน JSON แสดงดังต่อไปนี้ -

{
   "": "bar", 
   "foo": ""
}

รูปแบบสเกลาร์ของโฟลว์ ได้แก่ ประเภทที่ยกมาสองครั้งแบบยกมาเดี่ยวและแบบธรรมดา ตัวอย่างพื้นฐานสำหรับสิ่งเดียวกันได้รับด้านล่าง -

%YAML 1.2
---
!!map {
   ? !!str "implicit block key"
   : !!seq [
      !!map {
         ? !!str "implicit flow key"
         : !!str "value",
      }
   ]  
}

ผลลัพธ์ในรูปแบบ JSON สำหรับตัวอย่างที่ระบุข้างต้นแสดงไว้ด้านล่าง -

{
   "implicit block key": [
      {
         "implicit flow key": "value"
      }
   ] 
}

คอลเลกชันโฟลว์ใน YAML ซ้อนกับบล็อกคอลเลกชันภายในคอลเลกชันโฟลว์อื่น รายการคอลเลกชันโฟลว์ถูกยกเลิกด้วยcomma (,) ตัวบ่งชี้ ตัวอย่างต่อไปนี้จะอธิบายบล็อกการรวบรวมโฟลว์โดยละเอียด -

%YAML 1.2
---
!!seq [
   !!seq [
      !!str "one",
      !!str "two",
   ],
   
   !!seq [
      !!str "three",
      !!str "four",
   ],
]

เอาต์พุตสำหรับการรวบรวมโฟลว์ใน JSON แสดงไว้ด้านล่าง -

[
   [
      "one", 
      "two"
   ], 
   [
      "three", 
      "four"
   ]
]

รูปแบบโฟลว์เช่น JSON รวมถึงตัวบ่งชี้เริ่มต้นและสิ้นสุด รูปแบบการไหลเดียวที่ไม่มีคุณสมบัติคือสเกลาร์ธรรมดา

%YAML 1.2
---
!!seq [
!!seq [ !!str "a", !!str "b" ],
!!map { ? !!str "a" : !!str "b" },
!!str "a",
!!str "b",
!!str "c",]

ผลลัพธ์สำหรับโค้ดที่แสดงด้านบนในรูปแบบ JSON ได้รับด้านล่าง -

[
   [
      "a", 
      "b"
   ], 
   
   {
      "a": "b"
   }, 
   
   "a", 
   "b", 
   "c"
]

YAML มีรูปแบบสเกลาร์บล็อกสองแบบ: literal และ folded. บล็อกสเกลาร์ถูกควบคุมโดยมีตัวบ่งชี้เพียงไม่กี่ตัวที่มีส่วนหัวนำหน้าเนื้อหา ตัวอย่างของส่วนหัวของสเกลาร์บล็อกได้รับด้านล่าง -

%YAML 1.2
---
!!seq [
   !!str "literal\n",
   !!str "·folded\n",
   !!str "keep\n\n",
   !!str "·strip",
]

ผลลัพธ์ในรูปแบบ JSON ที่มีพฤติกรรมเริ่มต้นจะได้รับด้านล่าง -

[
   "literal\n", 
   "\u00b7folded\n", 
   "keep\n\n", 
   "\u00b7strip"
]

ประเภทของรูปแบบบล็อก

รูปแบบบล็อกมีสี่ประเภท: literal, folded, keep และ stripรูปแบบ รูปแบบบล็อกเหล่านี้ถูกกำหนดด้วยความช่วยเหลือของสถานการณ์บล็อกจอมปิง ตัวอย่างสถานการณ์การบล็อก chomping แสดงไว้ด้านล่าง -

%YAML 1.2
---
!!map {
   ? !!str "strip"
   : !!str "# text",
   ? !!str "clip"
   : !!str "# text\n",
   ? !!str "keep"
   : !!str "# text\n",
}

คุณสามารถดูผลลัพธ์ที่สร้างขึ้นด้วยสามรูปแบบใน JSON ตามที่ระบุด้านล่าง -

{
   "strip": "# text", 
   "clip": "# text\n", 
   "keep": "# text\n"
}

Chomping ใน YAML ควบคุมการแบ่งสุดท้ายและการลากเส้นว่างซึ่งตีความในรูปแบบต่างๆ

ปอก

ในกรณีนี้การแบ่งบรรทัดสุดท้ายและบรรทัดว่างจะไม่รวมสำหรับเนื้อหาสเกลาร์ มีการระบุโดยตัวบ่งชี้ chomping“ -“

การตัด

การคลิปถือเป็นลักษณะการทำงานเริ่มต้นหากไม่มีการระบุตัวบ่งชี้การจับคู่อย่างชัดเจน อักขระตัวแบ่งสุดท้ายจะถูกเก็บไว้ในเนื้อหาของสเกลาร์ ตัวอย่างที่ดีที่สุดของการตัดจะแสดงให้เห็นในตัวอย่างด้านบน จะสิ้นสุดด้วยการขึ้นบรรทัดใหม่“\n” ตัวละคร.

การรักษา

การเก็บรักษาหมายถึงการเพิ่มด้วยการแสดงตัวบ่งชี้“ +” chomping เส้นเพิ่มเติมที่สร้างขึ้นไม่สามารถพับได้ เส้นเพิ่มเติมไม่สามารถพับได้

เพื่อให้เข้าใจรูปแบบลำดับสิ่งสำคัญคือต้องเข้าใจคอลเลกชัน แนวคิดของคอลเลกชันและรูปแบบลำดับทำงานควบคู่กันไป คอลเลกชันใน YAML แสดงด้วยรูปแบบลำดับที่เหมาะสม หากคุณต้องการอ้างอิงการจัดลำดับแท็กที่เหมาะสมให้อ้างอิงคอลเลคชันเสมอ คอลเล็กชันใน YAML จัดทำดัชนีโดยจำนวนเต็มตามลำดับที่เริ่มต้นด้วยศูนย์ตามที่แสดงในอาร์เรย์ จุดสำคัญของรูปแบบลำดับเริ่มต้นด้วยคอลเลกชัน

ตัวอย่าง

ให้เราพิจารณาจำนวนดาวเคราะห์ในจักรวาลเป็นลำดับซึ่งสามารถสร้างเป็นคอลเลกชันได้ รหัสต่อไปนี้แสดงวิธีการแสดงรูปแบบลำดับของดาวเคราะห์ในจักรวาล -

# Ordered sequence of nodes in YAML STRUCTURE
Block style: !!seq
- Mercury   # Rotates - no light/dark sides.
- Venus     # Deadliest. Aptly named.
- Earth     # Mostly dirt.
- Mars      # Seems empty.
- Jupiter   # The king.
- Saturn    # Pretty.
- Uranus    # Where the sun hardly shines.
- Neptune   # Boring. No rings.
- Pluto     # You call this a planet?
Flow style: !!seq [ Mercury, Venus, Earth, Mars,      # Rocks
                    Jupiter, Saturn, Uranus, Neptune, # Gas
                    Pluto ]                           # Overrated

จากนั้นคุณจะเห็นผลลัพธ์ต่อไปนี้สำหรับลำดับลำดับในรูปแบบ JSON -

{
   "Flow style": [
      "Mercury", 
      "Venus", 
      "Earth", 
      "Mars", 
      "Jupiter", 
      "Saturn", 
      "Uranus", 
      "Neptune", 
      "Pluto"
   ], 
   
   "Block style": [
      "Mercury", 
      "Venus", 
      "Earth", 
      "Mars", 
      "Jupiter", 
      "Saturn", 
      "Uranus", 
      "Neptune", 
      "Pluto"
   ]
}

การแมปโฟลว์ใน YAML แสดงถึงคอลเลคชันคู่ค่าคีย์ที่ไม่เรียงลำดับ เรียกอีกอย่างว่าโหนดการแมป โปรดทราบว่าควรรักษาคีย์ที่ไม่ซ้ำกัน หากมีการซ้ำกันของคีย์ในโครงสร้างโฟลว์แมปจะทำให้เกิดข้อผิดพลาด ลำดับคีย์ถูกสร้างขึ้นในแผนผังการทำให้เป็นอนุกรม

ตัวอย่าง

ตัวอย่างโครงสร้างผังงานแสดงไว้ด้านล่าง -

%YAML 1.1
paper:
   uuid: 8a8cbf60-e067-11e3-8b68-0800200c9a66
   name: On formally undecidable propositions of  Principia Mathematica and related systems I.
   author: Kurt Gödel.
tags:
   - tag:
      uuid: 98fb0d90-e067-11e3-8b68-0800200c9a66
      name: Mathematics
   - tag:
      uuid: 3f25f680-e068-11e3-8b68-0800200c9a66
      name: Logic

ผลลัพธ์ของลำดับที่แมป (รายการที่ไม่เรียงลำดับ) ในรูปแบบ JSON มีดังที่แสดงด้านล่าง -

{
   "paper": {
      "uuid": "8a8cbf60-e067-11e3-8b68-0800200c9a66",
      "name": "On formally undecidable propositions of Principia Mathematica and related systems I.",
      "author": "Kurt Gödel."
   },
   "tags": [
      {
         "tag": {
            "uuid": "98fb0d90-e067-11e3-8b68-0800200c9a66",
            "name": "Mathematics"
         }
      },
      {
         "tag": {
            "uuid": "3f25f680-e068-11e3-8b68-0800200c9a66",
            "name": "Logic"
         }
      }
   ]
}

หากคุณสังเกตผลลัพธ์นี้ตามที่แสดงด้านบนจะสังเกตได้ว่าชื่อคีย์จะยังคงไม่ซ้ำกันในโครงสร้างการแมป YAML

ลำดับบล็อกของ YAML แสดงชุดของโหนด แต่ละรายการจะแสดงด้วยตัวบ่งชี้ "-" นำหน้า โปรดทราบว่าตัวบ่งชี้“ -” ใน YAML ควรแยกออกจากโหนดด้วยช่องว่าง

การแสดงพื้นฐานของลำดับบล็อกได้รับด้านล่าง -

block sequence:
··- one↓
  - two : three↓

ตัวอย่าง

ดูตัวอย่างต่อไปนี้เพื่อความเข้าใจที่ดีขึ้นเกี่ยวกับลำดับบล็อก

ตัวอย่าง 1

port: &ports
  adapter:  postgres
  host:     localhost

development:
  database: myapp_development
  <<: *ports

ผลลัพธ์ของลำดับบล็อกในรูปแบบ JSON ได้รับด้านล่าง -

{
   "port": {
      "adapter": "postgres",
      "host": "localhost"
   },
   "development": {
      "database": "myapp_development",
      "adapter": "postgres",
      "host": "localhost"
   }
}

สคีมา YAML ถูกกำหนดให้เป็นชุดของแท็กรวมกันและมีกลไกในการแก้ไขแท็กที่ไม่เฉพาะเจาะจง สคีมาที่ไม่ปลอดภัยใน YAML ถูกสร้างขึ้นในลักษณะที่สามารถใช้กับเอกสาร YAML ใดก็ได้ นอกจากนี้ยังถือเป็นสคีมาที่แนะนำสำหรับเอกสาร YAML ทั่วไป

ประเภท

สคีมาที่ไม่ปลอดภัยมีสองประเภท: Generic Mapping และ Generic Sequence

การทำแผนที่ทั่วไป

แสดงถึงคอนเทนเนอร์ที่เชื่อมโยงกัน ที่นี่แต่ละคีย์จะไม่ซ้ำกันในการเชื่อมโยงและแมปกับค่าเดียว YAML ไม่มีข้อ จำกัด สำหรับคำจำกัดความที่สำคัญ

ตัวอย่างสำหรับการแสดงการทำแผนที่ทั่วไปแสดงไว้ด้านล่าง -

Clark : Evans
Ingy : döt Net
Oren : Ben-Kiki
Flow style: !!map { Clark: Evans, Ingy: döt Net, Oren: Ben-Kiki }

ผลลัพธ์ของโครงสร้างการทำแผนที่ทั่วไปในรูปแบบ JSON แสดงอยู่ด้านล่าง -

{
   "Oren": "Ben-Kiki", 
   "Ingy": "d\u00f6t Net", 
   "Clark": "Evans", 
   "Flow style": {
      "Oren": "Ben-Kiki", 
      "Ingy": "d\u00f6t Net", 
      "Clark": "Evans"
   }
}

ลำดับทั่วไป

มันแสดงถึงประเภทของลำดับ ประกอบด้วยคอลเล็กชันที่จัดทำดัชนีโดยจำนวนเต็มตามลำดับที่เริ่มต้นด้วยศูนย์ มันแสดงด้วย!!seq แท็ก

Clark : Evans
Ingy : döt Net
Oren : Ben-Kiki
Flow style: !!seq { Clark: Evans, Ingy: döt Net, Oren: Ben-Kiki }

เอาต์พุตสำหรับลำดับทั่วไปของการป้องกันความผิดพลาดนี้

schema is shown below:
{
   "Oren": "Ben-Kiki", 
   "Ingy": "d\u00f6t Net", 
   "Clark": "Evans", 
   "Flow style": {
      "Oren": "Ben-Kiki", 
      "Ingy": "d\u00f6t Net", 
      "Clark": "Evans"
   }
}

สคีมา JSON ใน YAML ถือเป็นตัวส่วนร่วมของภาษาคอมพิวเตอร์สมัยใหม่ส่วนใหญ่ อนุญาตให้แยกวิเคราะห์ไฟล์ JSON ขอแนะนำอย่างยิ่งใน YAML ว่าควรพิจารณาสคีมาอื่น ๆ ในสคีมา JSON เหตุผลหลักคือการรวมค่าคีย์ที่เป็นมิตรกับผู้ใช้ ข้อความสามารถเข้ารหัสเป็นคีย์และสามารถใช้เป็นและเมื่อจำเป็น

สคีมา JSON เป็นสเกลาร์และไม่มีค่า รายการการแมปในสคีมา JSON จะแสดงในรูปแบบของคู่คีย์และค่าบางคู่โดยที่ค่าว่างถือว่าถูกต้อง

ตัวอย่าง

สคีมา null JSON แสดงดังที่แสดงด้านล่าง -

!!null null: value for null key
key with null value: !!null null

ผลลัพธ์ของการเป็นตัวแทน JSON ถูกกล่าวถึงด้านล่าง -

{
   "null": "value for null key", 
   "key with null value": null
}

ตัวอย่าง

ตัวอย่างต่อไปนี้แสดงถึงสคีมา Boolean JSON -

YAML is a superset of JSON: !!bool true
Pluto is a planet: !!bool false

ต่อไปนี้เป็นผลลัพธ์ที่เหมือนกันในรูปแบบ JSON -

{
   "YAML is a superset of JSON": true, 
   "Pluto is a planet": false
}

ตัวอย่าง

ตัวอย่างต่อไปนี้แสดงสคีมา JSON จำนวนเต็ม -

negative: !!int -12
zero: !!int 0
positive: !!int 34
{
   "positive": 34, 
   "zero": 0, 
   "negative": -12
}

ตัวอย่าง

แท็กในสคีมา JSON แสดงด้วยตัวอย่างต่อไปนี้ -

A null: null
Booleans: [ true, false ]
Integers: [ 0, -0, 3, -19 ]
Floats: [ 0., -0.0, 12e03, -2E+05 ]
Invalid: [ True, Null, 0o7, 0x3A, +12.3 ]

คุณสามารถค้นหา JSON Output ดังที่แสดงด้านล่าง -

{
   "Integers": [
      0, 
      0, 
      3, 
      -19
   ], 
   
   "Booleans": [
      true, 
      false
   ], 
   "A null": null, 

   "Invalid": [
         true, 
         null, 
         "0o7", 
         58, 
         12.300000000000001
   ], 
   
   "Floats": [
      0.0, 
      -0.0, 
      "12e03", 
      "-2E+05"
   ]
}