#

YAML là gì? Đặc điểm và các kiểu dữ liệu YAML

Trong vài năm qua Ain’t Markup Language (YAML) là một trong những ngôn ngữ tuần tự hóa được sử dụng khá rộng rãi.

Thông thường YAML được dùng để định dạng cho các file cấu hình, tuy nhiên với việc sở hữu một số thế mạnh nó được đánh giá là đối thủ nặng ký để thay thế một vài ngôn ngữ chẳng hạnh như JSON.

Hãy cùng BKHOST tìm hiểu chi tiết về YAML trong bài viết dưới đây.

Giảm giá lên đến 30% khi đăng ký Cloud VPS tại BKHOST

BKHOST cung cấp dịch vụ Cloud VPS với nhiều mức giá và cấu hình khác nhau, đáp ứng nhu cầu của tất cả khách hàng. Đăng ký ngay:

Cam kết hoàn tiền lên đến 100% nếu Quý khách không hài lòng với chất lượng sản phẩm, dịch vụ.

YAML là gì?

YAML

YAML (Ain’t Markup Language) được sử dụng để biểu diễn dữ liệu dưới dạng text (giống XML, JSON …). YAML được dùng vào mục đích tương tự JSON, XML nhưng nó lại có nhiều tính năng nổi bật hơn vì cấu trúc dữ liệu linh hoạt hơn, hỗ trợ nhiều ngôn ngữ lập trình, diễn đạt và mở rộng dữ liệu hơn và dễ sử dụng vì khá có nhiều kiểu dữ liệu lập trình.

Đặc điểm của file YAML

Nào! Hãy cùng chúng tôi xem xét một file YAML sau để có cái nhìn tổng quan nhất.

---
doe: "a deer, a female deer"
ray: "a drop of golden sun"
pi: 3.14159
xmas: true
french-hens: 3
calling-birds:
- huey
- dewey
- louie
- fred
xmas-fifth-day:
calling-birds: four
french-hens: 3
golden-rings: 5
partridges:
count: 1
location: "a pear tree"
turtle-doves: two

Dấu hiệu để nhận biết một tài liệu YAML đó chính là ba dấu gạch ngang ở đầu dòng. Những dấu gạch ngang này đánh dấu cho sự xuất hiện của một file mới. Quan sát tiếp ta sẽ thấy cấu trúc điển hình của một tài liệu YAML là một cặp key – value đi đôi với nhau.

File YAML ở trên bắt đầu với 6 cặp key – value. Trong đó có thể thấy các key “Doe, ray, pi, xmas, french-hens” đều có những value tương ứng. Một điều bạn cần biết là YAML có khả năng hỗ trợ nhiều chuỗi value và chúng sẽ có 4 kiểu dữ liệu khác nhau.

Doe và ray là chuỗi (Doe hướng đến hai chuỗi value: “a deer, a female deer”), pi là dấu phẩy động, xmas là một boolean trong khi đó french-hens lại là một số nguyên. Khi mô tả các chuỗi value bạn được phép bỏ chúng trong dấu ngoặc kép, dấu ngoặc đơn. Trường hợp các số không được trích dẫn bằng dấu phẩy động hoặc số nguyên vẫn được ngôn ngữ YAML nhận dạng.

Mục tiếp theo là một mảng, quan sát sẽ thấy calling-birds có 4 phần tử và trước mỗi phần tử đều được biểu thị bằng một dấu gạch ngang. Ngoài ra các phần tử đều được thụt đầu dòng hai khoảng trắng. Đây là cách thức để thể hiện các phần tử con được bao hàm bởi phần tử cha. Tương tự như vậy, xmas-fifth-day cũng chứa 5 phần tử và các phần tử này đều được thụt vào.

Và bây giờ, bạn hãy xem tài liệu trên sẽ trông như thế nào ở ngôn ngữ JSON. Và nếu như bạn muốn thì hoàn toàn có thể chuyển đổi tài liệu từ định dạng YAML sang JSON và ngược lại.

{
"doe": "a deer, a female deer",
"ray": "a drop of golden sun",
"pi": 3.14159,
"xmas": true,
"french-hens": 3,
"calling-birds": [
"huey",
"dewey",
"louie",
"fred"
],
"xmas-fifth-day": {
"calling-birds": "four",
"french-hens": 3,
"golden-rings": 5,
"partridges": {
"count": 1,
"location": "a pear tree"
},
"turtle-doves": "two"
}
}

Định dạng YAML

Một trong những định dạng của YAML là khoảng trắng. Khi bạn thiết kế một tài liệu YAML tùy thuộc vào từng trường hợp để thụt lề đúng với quy định. Mức thụt lề là một hoặc nhiều khoảng trắng. Dưới đây là một tài liệu có phần lề thụt vào hai khoảng trắng:

foo: bar
         pleh: help
         stuff:
                  foo: bar
                   bar: foo

Bây giờ chúng ta hãy xem cách một tập lệnh Python phân tích tài liệu YAML. Chúng tôi sẽ lưu tài liệu dưới dạng tệp có tên là foo.yaml. Để Python có thể đọc file YAML phải cần đến thư viện PyYAML. Chức năng chính của PyYAML là ánh xạ file YAML vào từ điển.
import yaml

if __name__ == '__main__':

                stream = open("foo.yaml", 'r')
               dictionary = yaml.load(stream)
               for key, value in dictionary.items():
                     print (key + " : " + str(value))

Đầu ra sẽ là:
foo : bar
pleh : help
stuff : {'foo': 'bar', 'bar': 'foo'}

Comment trong YAML

Sử dụng dấu# để bắt đầu comment trong file YAML. Phần comment này có thể xuất hiện sau value hoặc chiếm nguyên toàn bộ dòng.

___
# This is a full line comment
foo: bar # this is a comment, too

Kiểu dữ liệu YAML

Mỗi cặp key – value ở YAML đều chứa những value vô hướng. Cách thức hoạt động của chúng tương tự như các kiểu vô hướng ở những ngôn ngữ khác như Python, Javascript, Perl. Một số kiểu dữ liệu phổ biến của YAML có thể kể đến như:

Từ điển và cặp key – value

Key – value là yếu tố chủ chốt trong cú pháp của YAML. Trong file YAML, mỗi mục của nó có thể thuộc một từ điển bất kì. Trong khi key luôn là một chuỗi thì value lại có tính chất vô hướng nên nó có thể là kiểu dữ liệu chuỗi, số hoặc một từ điển.

 Loại số

Kiểu số cũng được YAML nhận dạng chẳng hạn như dấu phẩy động và số nguyên ở ví dụ đầu tiên mà chúng ta đã phân tích. Số nguyên trong file YAML có thể là thập phân, lục phân hoặc bát phân.

---
foo: 12345
bar: 0x12d4
plop: 023332

Và ngay sau đây hãy chạy tập lệnh python để phân tích cú pháp của tài liệu này.
foo : 12345
bar : 4820
plop : 9946

Không ngoài mong đợi, Ox biểu thị một value là hex và tất nhiên số 0 đứng đầu sẽ biểu thị một value bát phân. Qua kết quả có thể thấy YAML còn có tính năng hỗ trợ hàm mũ và dấu phẩy động cố định.
---
foo: 1230.15
bar: 12.3015e+05

Khi tiến hành đánh giá các mục này chúng tôi nhận thấy:
foo : 1230.15
bar : 1230150.0

Và bây giờ chúng ta sẽ biểu diễn tập lệnh dưới dạng not-a-number (NAN) hoặc infinity (Foo là inf, bar là âm inf còn plop là NAN).
---
foo: .inf
bar: -.Inf
plop: .NAN

Strings

Ở hầu hết các trường hợp bạn không cần phải bắt buộc chuỗi được đặt trong dấu ngoặc kép, ví dụ như:

---
foo: this is a normal string

Phần mềm chạy thử của chúng tôi sẽ xử lý chuỗi trên như sau:
foo: this is a normal string

Tuy nhiên nếu bạn muốn xử lý một escape sequences (chuỗi thoát) bạn phải cần tới dấu ngoặc kép.
---
foo: "this is not a normal string\n"
bar: this is not a normal string\n

Vì giá trị thứ hai không được trích dẫn do đó YAML sẽ xử lý giá trị đầu tiên khi kết thúc bằng ký tự xuống dòng. Trong file dưới đây YAML xem \ n là hai kí tự.
foo: this is not a normal string
bar: this is not a normal string\n

Các chuỗi trong YAML vẫn thường chứa các dấu nháy đơn để biểu thị cho văn bản dài với giá trị chuỗi kéo dài ở nhiều dòng.
bar: >
this is not a normal string it
spans more than
one line
see?

Tuy nhiên các chuỗi đó có thể được giải thích chỉ ở trên một dòng.
bar : this is not a normal string it spans more than one line see?

Mặc dù ký tự khối (pipe) cũng có thể thực hiện được điều nói trên nhưng YAML thông dịch một cách chính xác hơn.
bar: |
this is not a normal string it
spans more than
one line
see?

Chính vì thế mà chúng ta có thể thấy các dòng mới xuất hiện ở vị trí của chúng trong file YAML.
bar : this is not a normal string it
spans more than
one line
see?

Nulls

Bạn hãy nhập null với dấu ngã hoặc một chuỗi null nguyên vẹn.

---
foo: ~
bar: null

Chương trình sẽ cho ra kết quả:
foo : None
bar : None

Như vậy có thể thấy Python không hỗ trợ biểu diễn null.

Booleans

Các giá trị boolean được YAML chỉ ra thông qua keyword True hoặc False. On và Yes biểu thị cho True còn Off hoặc No biểu thị cho False.

---
foo: True
bar: False
light: On
TV: Off

Mảng

Bạn có thể chỉ định mảng hoặc danh sách trên một dòng.

---
items: [ 1, 2, 3, 4, 5 ]
names: [ "one", "two", "three", "four" ]

Ngoài ra bạn cũng có thể biểu diễn chúng trên nhiều dòng.
---
items:
- 1
- 2
- 3
- 4
- 5
names:
- "one"
- "two"
- "three"
- "four"

Với những danh sách chứa nhiều đối tượng phức tạp thì tốt nhất là định dạng nhiều dòng.
___
items:
- things:
thing1: huey
things2: dewey
thing3: louie
- other things:
key: value

Từ điển

Tương tự như mảng, bạn có thể biểu diễn từ điển trên một dòng.

---
foo: { thing1: huey, thing2: louie, thing3: dewey }

Và đây là một cách khác.
---
foo: bar
bar: foo

Bên cạnh đó chúng cũng có thể được lồng vào nhau, ví dụ như:
---
foo:
bar:
- bar
- rab
- plop

Tổng kết về YAML

Bài viết trên chúng tôi đã thông tin về cú pháp và một số vấn đề liên quan tới YAML Ain’t Markup Language. Nếu bạn muốn đọc code nhanh chóng và dễ dàng hơn thì phương án tối ưu là kết hợp YAML với những ngôn ngữ lập trình khác.

Nếu bạn có thắc mắc về YAML bạn có thể tham khảo thêm ở trang https://yaml.org/, hoặc để lại ở bên bình luận bên dưới, BKHOST sẽ trả lời bạn trong thời gian sớm nhất.

P/s: Bạn cũng có thể truy cập vào Blog của BKHOST để đọc thêm các bài viết chia sẻ kiến thức về lập trình, quản trị mạng, website, domain, hosting, vps, server, email,… Chúc bạn thành công.

Đăng ký dịch vụ Cloud Server tại BKHOST

BKHOST đang có chương trình khuyến mãi cực shock dành cho khách hàng đăng ký dịch vụ Cloud Server:

  • Giảm giá lên đến 30%.
  • Tặng thêm 1GB Ram.

Đăng ký ngay:

thuê cloud server

Tôi là Trịnh Duy Thanh, CEO & Founder Công ty Cổ Phần Giải Pháp Mạng Trực Tuyến Việt Nam - BKHOST. Với sứ mệnh mang tới các dịch vụ trên Internet tốt nhất cho các cá nhân và doanh nghiệp trong nước và quốc tế, tôi luôn nỗ lực hết mình nâng cấp đầu tư hệ thống phần cứng, nâng cao chất lượng dịch vụ chăm sóc khách hàng để đem đến những sản phẩm hoàn hảo nhất cho người tiêu dùng. Vì vậy, tôi tin tưởng sẽ đem đến các giải pháp CNTT mới nhất, tối ưu nhất, hiệu quả nhất và chi phí hợp lý nhất cho tất cả các doanh nghiệp.
Bình luận

Thanh toán linh hoạt

Chúng tôi chấp nhận thanh toán như ATM, Visa, Internet Banking, Paypal, Baokim, Ngân lượng

Gọi ĐT tư vấn ngay
Chat ngay qua Zalo
Chat ngay qua Messenger