สรุป JSON และ YAML ที่ทุกคนควรรู้ (โดยเฉพาะสาย Cloud/DevOps)
ยุคนี้คงไม่มีใครหนี data format อย่าง JSON และ YAML พ้น เราจะมาเรียนเรื่องของ JSON และ YAML ภายใน 1–2 ชั่วโมงว่ามันคืออะไรและใช้งานยังไง
(เป็นการนำบทความเก่าเมื่อ 3 ปีก่อนของผมมา rewrite ใหม่)
ทำไมต้องสนใจ JSON และ YAML?
- ถูกใช้ใน cloud platform หลายส่วน เช่น configuration, policy, template หรือ API output ต่าง ๆ
- JSON นิยมใช้เป็น input และ output ของ API ในการรับส่งข้อมูล
- หลาย platform สามารถเลือก output เป็น YAML ได้
- YAML ถูกใช้เป็น config file ของ tool หลายตัว เช่น Ansible, Kubernetes หรือ CI/CD tool ต่าง ๆ
- YAML เหมาะสำหรับใช้เป็น config file ของ script หรือ application ของเรา
JSON คืออะไร?
- JSON ย่อมาจาก JavaScript Object Notation
- อ่านว่า เจ-ซอน (หรือที่ได้ยินคนไทยเรียกบ่อย ๆ คือ เจ-สัน)
- JSON คือ data format หรือเรียกได้ว่าเป็นรูปแบบในการจัดเก็บข้อมูลที่เป็นมาตรฐาน
โครงสร้างของ JSON (Structure/Syntax)
- อยู่ในรูปแบบของ key-value pairs
- ใช้ colon (
:
) ในการแบ่ง key และ value - Key-value pairs จะถูกครอบด้วย curly bracket (
{ }
) และนับเป็นหนึ่ง object - หนึ่ง object สามารถมีได้หลาย key-value pairs โดยขั้นด้วย comma (
,
)
ตัวอย่าง JSON Object ที่มี 1 Key-Value Pair
"animal"
คือ key (อยู่ฝั่งซ้าย)"dog"
คือ value (อยู่ฝั่งขวา)
{"animal": "dog"}
ตัวอย่าง JSON Object ที่มี 2 Key-Value Pair
- มีทั้งหมด 2 key-value pair
- แยกแต่ละ key-value pair ด้วย comma (
,
)
{"animal": "dog", "color": "white"}
และ JSON สามารถจัด indentation ให้มนุษย์อ่านได้ง่ายขึ้นแบบนี้
{
"animal": "dog",
"color": "white"
}
เครื่องมือตรวจเช็ค JSON Syntax
- ใช้ online tool ช่วยในการ validate JSON ที่เราเขียนได้ เช่น
- JSON Formatter & Validator
- JSON Editor Online
- JSONLint
ชนิดข้อมูล ของ JSON (Data Type)
String
- String คือชนิดของข้อมูลที่เป็นข้อความ
- จะต้องถูกครอบด้วย double quotes (
" "
)
ตัวอย่าง JSON ที่มี Value เป็น String
{
"message1": "Hello, JSON and YAML",
"message2": "My name is Nopnithi",
"message3": "I'm a cloud architect."
}
Number
- Number คือชนิดของข้อมูลที่เป็นตัวเลข
- เป็นได้ทั้ง integer (จำนวนเต็ม), float (ทศนิยม) หรือเลขยกกำลัง
- Number ไม่ต้องครอบด้วย double quotes (
" "
) - ถ้าครอบจะกลายเป็น string ที่เป็นตัวเลข
ตัวอย่าง JSON ที่มี Value เป็น Number
{
"age": 45,
"price": 22.59,
"latitude": 47.606209,
"longitude": -122.332071
}
Boolean
- Boolean คือชนิดข้อมูลที่มีเพียงแค่สองตัว คือ
true
หรือfalse
เท่านั้น
ตัวอย่าง JSON ที่มี Value เป็น Boolean
{
"CloudIsHard": false,
"is_enabled": true
}
Null
- Null คือชนิดของข้อมูลที่ไม่มีอยู่ (ว่างเปล่า)
- อย่าเข้าใจผิด ข้อมูลที่ไม่มีอยู่ไม่เท่ากับ
0
หรือfalse
ตัวอย่าง JSON ที่มี Value เป็น Null
- เช่น ข้อมูลชื่อของนายสมชาย รักคลาวด์ (ซึ่งไม่มีชื่อกลาง)
{"name": "Somchai", "middlename": null, "lastname": "Rukcloud"}
Array
- Array คือชนิดของข้อมูลที่เป็น list (รายการที่มีหลายชิ้น)
- ถูกเขียนอยู่ใน square bracket (
[ ]
) - แต่ละ item ถูกแยกด้วย comma (
,
) - แต่ละ item จะเป็น data type ไหนก็ได้
ตัวอย่าง JSON ที่มี Value เป็น Array
- เช่น
["AWS", "Azure", "GCP"]
คือ array - แต่ละ item มี data type เป็น string
{
"cloud_providers": [
"AWS",
"Azure",
"GCP"
]
}
Object
- Object คือชนิดของข้อมูลที่เป็น object
- พูดง่าย ๆ ก็คือเป็น JSON ซ้อน JSON อีกที (nested objects)
ตัวอย่าง JSON ที่มี Value เป็น Object
{"website": <object>}
สมมุติว่า <object>
คือ
{"domain": "nopnithi.dev", "ip": "1.1.1.1"}
ดังนั้นเมื่อรวมกันจะได้ (จัด indentation แล้ว)
{
"website": {
"domain": "nopnithi.dev",
"ip": "1.1.1.1"
}
}
Lab: สร้างไฟล์ JSON
โจทย์: สร้าง JSON จากข้อมูลของนักฟุตบอล Lionel Messi
เฉลย
{
"full_name": "Lionel Andres Messi",
"date_of_birth": "1987-06-24T00:00:00.000Z",
"place_of_birth": "Argentina",
"height": 169,
"position": "Forward",
"club_information": {
"current_team": "Paris Saint-Germain",
"number": 30
},
"youth_careers": [
{
"year": "1992-1995",
"team": "Grandoli"
},
{
"year": "1995-2000",
"team": "Newell's Old Boys"
},
{
"year": "2000-2003",
"team": "Barcelona"
}
],
"senior_careers": [
{
"year": "2003-2004",
"team": "Barcelona C",
"apps": 10,
"goals": 5
},
{
"year": "2004-2005",
"team": "Barcelona B",
"apps": 22,
"goals": 6
},
{
"year": "2004-2021",
"team": "Barcelona",
"apps": 520,
"goals": 474
},
{
"year": "2021-current",
"team": "Paris Saint-Germain",
"apps": 26,
"goals": 6
}
]
}
YAML คืออะไร?
- YAML ย่อมาจาก YAML Ain’t Markup Language
- อ่านว่า แย-มอล (พยายามอ่านให้เป็นสำเนียงภาษาอังกฤษด้วย ฮ่า ๆ)
- YAML เป็น data format ตัวหนึ่ง (เช่นเดียวกับ JSON)
- เขียนและอ่านง่ายกว่า JSON (ในสายตามนุษย์)
โครงสร้างของ YAML (Structure/Syntax)
- อยู่ในรูปแบบของ key-value pairs
- ใช้ colon (
:
) ในการแบ่ง key และ value - ไฟล์ YAML จะขึ้นต้นด้วย
---
- สามารถ comment ใน YAML ได้ เช่น
# This is a comment
(ดีกว่า JSON) - หนึ่ง object สามารถมีได้หลาย key-value pairs โดยแยกด้วยการขั้นบรรทัดใหม่
ตัวอย่าง YAML Object (ที่มี 1 Key-Value Pair)
animal
คือ key (อยู่ฝั่งซ้าย)"dog"
คือ value (อยู่ฝั่งขวา)- Key (เป็น string) ไม่จำเป็นต้องใช้ double quotes (
" "
) แบบ JSON
---
animal: "dog"
ตัวอย่าง YAML Object (ที่มี 2 Key-Value Pair)
- มีทั้งหมด 2 key-value pair
- แยกแต่ละ key-value pair ด้วยการขั้นบรรทัดใหม่ (
\n
)
---
animal: "dog"
color: "white"
เครื่องมือตรวจเช็ค YAML Syntax
- ใช้ online tool ช่วยในการ validate YAML ที่เราเขียนได้ เช่น
- YAML Validator
- YAML Lint
ชนิดข้อมูล ของ YAML (Data Type)
- แบ่งออกเป็น 2 กลุ่ม ได้แก่
- Scalar
- Collection
Scalar: String
- String คือชนิดของข้อมูลที่เป็นข้อความ
- ถ้า string เป็น value จะต้องครอบด้วย double quotes (
" "
) - ถ้า string เป็น key ไม่ต้องครอบ (ต่างกับ JSON)
ตัวอย่าง YAML ที่มี Value เป็น String
---
message1: "Hello, JSON and YAML"
message2: "My name is Nopnithi",
message3: "I'm a cloud architect."
ตัวอย่าง YAML ที่มี Value เป็น String ยาว
- String ที่ยาวมาก สามารถใช้
|
ช่วยจัดการเรื่องการขึ้นบรรทัดใหม่ให้ได้
---
message: |
YAML is a human-readable data-serialization language.
It is commonly used for configuration files and in
applications where data is being stored or transmitted.
YAML targets many of the same communications applications
as Extensible Markup Language (XML) but has a minimal syntax.
จะได้
YAML is a human-readable data-serialization language.
It is commonly used for configuration files and in
applications where data is being stored or transmitted.
YAML targets many of the same communications applications
as Extensible Markup Language (XML) but has a minimal syntax.
แต่ถ้าไม่อยากให้มีการขึ้นบรรทัดใหม่ให้ใช้ >
แทน
---
message: >
YAML is a human-readable data-serialization language.
It is commonly used for configuration files and in
applications where data is being stored or transmitted.
YAML targets many of the same communications applications
as Extensible Markup Language (XML) but has a minimal syntax.
จะได้
YAML is a human-readable data-serialization language. It is commonly used for configuration files and ina pplications where data is being stored or transmitted. YAML targets many of the same communications applications as Extensible Markup Language (XML) but has a minimal syntax.
Scalar: Number
- Number คือชนิดของข้อมูลที่เป็นตัวเลข
- เป็นได้ทั้ง integer (จำนวนเต็ม), float (ทศนิยม) หรือเลขยกกำลัง
- Number ไม่ต้องครอบด้วย double quotes (
" "
) - ถ้าครอบจะกลายเป็น string ที่เป็นตัวเลข
ตัวอย่าง YAML ที่มี Value เป็น Number
---
age: 45,
price: 22.59,
latitude: 47.606209,
longitude: -122.332071
Scalar: Boolean
- Boolean คือชนิดข้อมูลที่มีเพียงแค่สองตัว คือ
True
หรือFalse
เท่านั้น - YAML ใช้ตัวแรกเป็นตัวพิมพ์ใหญ่ (แต่ JSON เป็นตัวพิมพ์เล็กหมด)
True
สามารถใช้On
หรือYes
แทนได้False
สามารถใช้Off
หรือNo
แทนได้
ตัวอย่าง YAML ที่มี Value เป็น Boolean
---
cloudIsHard: False
is_enabled: Yes
switch: On
Scalar: Null
- Null คือชนิดของข้อมูลที่ไม่มีอยู่
- ข้อมูลไม่มีอยู่ไม่ใช่
0
หรือfalse
- Null ใน YAML สามารถเขียนได้ 3 แบบ เช่น
middlename: null
middlename: ~
middlename:
ตัวอย่าง YAML ที่มี Value เป็น Null
---
name: "John"
middlename: null
lastname: "Doe"
Scalar: Date
- Date คือชนิดของข้อมูลที่เป็นวันที่และเวลา (JSON ไม่มี)
- ใช้ ISO-8601 standard ในรูปแบบนี้
YYYY-MM-DD
เช่น - วันที่ 30 ธันวาคม 2022 เขียนเป็น
2022-12-30
- และยังสามารถระบุเวลาได้ดังนี้ อ่านเพิ่มเติม
ตัวอย่าง YAML ที่มี Value เป็น Date
---
date_of_birth: 2022-12-30
start_time: 2022-12-30T21:59:43.10-05:00
Collection: Array
- Array คือชนิดของข้อมูลที่เป็น list (รายการที่มีหลายชิ้น)
- ใช้การขึ้นบรรทัดใหม่และ
-
เพื่อแยกแต่ละ item - แต่ละ item จะเป็น data type ไหนก็ได้
ตัวอย่าง YAML ที่มี Value เป็น Array
- แต่ละ item มี data type เป็น string
---
cloud_providers:
- AWS
- Azure
- GCP
หรือสามารถเขียนอีกแบบได้เป็น
---
cloud_providers: ["AWS", "Azure", "GCP"]
Collection: Dictionary (มองว่าเหมือนกับ Object ก็ได้)
- Dictionary คือชนิดของข้อมูลที่เป็น YAML object
- พูดง่าย ๆ ก็คือเป็น YAML ซ้อน YAML อีกที (nested objects)
ตัวอย่าง YAML ที่มี Value เป็น Dictionary
---
website: <dictionary>
สมมุติว่า <dictionary>
คือ
domain: "nopnithi.dev"
ip: "1.1.1.1"
ดังนั้นเมื่อรวมกันจะได้
---
website:
domain: "nopnithi.dev"
ip: "1.1.1.1"
การกำหนด Data Type อย่างชัดเจน (Explicit Typing)
- ปกติ YAML จะรู้ว่าลักษณะข้อมูลแบบไหนเป็น data type อะไร (dynamic)
- แต่บางครั้งอาจไม่ตรงกับที่เราต้องการ เช่น
2022-12-30
ไม่ใช่ date แต่เป็น string1234
ไม่ใช่ number แต่เป็น string17unp5WZmZgAAAOfn515eXv
ไม่ใช่ string แต่เป็น binary (number)
ตัวอย่าง การกำหนด Data Type ใน YAML
---
not_date: !!str 2022-12-30
not_number: !!str 1234
not_string: !!binary 17unp5WZmZgAAAOfn515eXv
Lab: สร้างไฟล์ YAML
โจทย์: สร้าง YAML จากข้อมูลของนักฟุตบอล Lionel Messi
เฉลย
---
full_name: "Lionel Andres Messi"
date_of_birth: 1987-06-24
place_of_birth: "Argentina"
height: 169
position: "Forward"
club_information:
current_team: "Paris Saint-Germain"
number: 30
youth_careers:
- year: "1992-1995"
team: "Grandoli"
- year: "1995-2000"
team: "Newell's Old Boys"
- year: "2000-2003"
team: "Barcelona"
senior_careers:
- year: "2003-2004"
team: "Barcelona C"
apps: 10
goals: 5
- year: "2004-2005"
team: "Barcelona B"
apps: 22
goals: 6
- year: "2004-2021"
team: "Barcelona"
apps: 520
goals: 474
- year: "2021-current"
team: "Paris Saint-Germain"
apps: 26
goals: 6