JSON หรือ YAML
สรุปสำคัญ: JSON คั่นโครงสร้างด้วยปีกกา ส่วน YAML ใช้การย่อหน้า: เครื่องจักรได้ JSON คนที่ดูแล config ได้ YAML แต่คอมเมนต์ anchor และโครงสร้างหลายเอกสารจะหายไป

สรุปสั้น ๆ: ใช้ JSON สำหรับข้อมูลระหว่างเครื่องกับเครื่อง และใช้ YAML สำหรับ config ที่มนุษย์แก้; เลือก YAML เมื่อต้องการคอมเมนต์ ข้อความหลายบรรทัด หรือ anchor และเลือก JSON เมื่อทุกภาษาต้อง parse payload เดียวกันโดยไม่มีความกำกวม
เทียบกันทีละด้าน
{
"server": {
"host": "127.0.0.1",
"port": 8080
}
}
server:
host: 127.0.0.1
port: 8080
โครงสร้างเดียวกัน YAML ตัดเครื่องหมายวรรคตอนออกและได้ที่สำหรับคอมเมนต์
จุดที่ต่างกัน
| JSON | YAML | |
|---|---|---|
| โครงสร้าง | ปีกกาและคอมมา | การย่อหน้า |
| คอมเมนต์ | ไม่มี | มี |
| สตริง | เครื่องหมายคำพูดคู่ ต้อง escape | มักไม่ต้องใส่เครื่องหมายคำพูด |
| ข้อความหลายบรรทัด | escape ด้วย \n หรือใช้อาร์เรย์ |
block scalar ` |
| การใช้ซ้ำ | ไม่มี | anchor & และ alias * |
| หลายเอกสาร | ห่อด้วยอาร์เรย์ | ตัวคั่น --- |
| ความเร็วในการ parse | เร็ว | ช้ากว่า เพราะมีกฎการย่อหน้า |
| ความกำกวม | ต่ำมาก | no ถูก parse เป็น boolean, ย่อหน้าคลาดหนึ่งระดับ |
แถวสุดท้ายคือต้นทุนจริงของ YAML ใน YAML 1.1 country: NO ให้ค่า boolean false และ version: 1.0 อาจกลายเป็น float JSON ไม่มี implicit typing เลย
การเลือกใช้
JSON: body ของ request และ response, ข้อความระหว่าง service, คอลัมน์ JSON ในฐานข้อมูล, อะไรก็ตามที่ต้อง parse เหมือนกันทุกภาษา
YAML: ระบบที่มันเป็นค่าเริ่มต้น (Kubernetes, Ansible, GitHub Actions, Docker Compose); config ที่ต้องมีคำอธิบาย; ไฟล์ที่เน้นข้อความยาว เช่น certificate, script หรือ SQL
สิ่งที่หายไปเมื่อแปลง
YAML → JSON: คอมเมนต์ทั้งหมด, การใช้ anchor ซ้ำ (ถูกขยายเป็นข้อมูลซ้ำ), ทุกเอกสารยกเว้นเอกสารแรก และรูปแบบการเขียนวันที่กับ boolean เดิม
JSON → YAML: ความต่างระหว่างสตริงกับตัวเลขอ่อนลง ดังนั้น "8080" กับ 8080 ต้องใส่เครื่องหมายคำพูดให้ชัดเพื่อความปลอดภัย
แปลงเพื่อ migration และตรวจแบบครั้งเดียว อย่าดูแลไฟล์เดียวกันในสองรูปแบบเป็นมุมมองคู่ขนาน
คำถามที่พบบ่อย
ควรตัดสินใจเลือกระหว่าง JSON กับ YAML อย่างไร?
เริ่มจากคนที่อ่านและดูแลไฟล์: ใช้ JSON เมื่อโปรแกรมสร้างไฟล์ ข้ามขอบเขตภาษา และต้อง parse ได้คาดเดาได้; ใช้ YAML เมื่อมนุษย์แก้และต้องการคำอธิบายฟิลด์หรือข้อความหลายบรรทัด ทั้งสองแปลงหากันได้ แต่ไม่ควรดูแล config เดียวกันในสองรูปแบบระยะยาว
ทำไม YAML ถึงมีความกำกวมเรื่องชนิดข้อมูลมากกว่า?
YAML มี implicit typing ค่าอย่าง NO, on หรือ 1.0 จึงกลายเป็น boolean วันที่ หรือตัวเลขได้ JSON มีชนิดชัดเจนเท่านั้น: สตริงต้องใส่เครื่องหมายคำพูด ทำให้ parse คาดเดาได้มากกว่าในต่างภาษา
คอมเมนต์และ anchor ควรคงอยู่เมื่อแปลง YAML เป็น JSON ไหม?
ไม่ควร คอมเมนต์ anchor และหลายเอกสารของ YAML แทนไม่ได้ใน JSON; anchor ถูกขยายเป็นเนื้อหาซ้ำ หากต้องเก็บไว้ ให้ใช้ไลบรารี YAML ที่มี Document API แทนการแปลงผ่าน object ไปกลับ