YAML และ JSON แตกต่างกันอย่างไร


735

YAML และ JSON แตกต่างกันอย่างไรโดยเฉพาะเมื่อพิจารณาสิ่งต่อไปนี้

  • ประสิทธิภาพ (เวลาเข้ารหัส / ถอดรหัส)
  • การใช้หน่วยความจำ
  • ความชัดเจนของนิพจน์
  • ความพร้อมใช้งานของห้องสมุดใช้งานง่าย (ฉันชอบ C)

ฉันวางแผนที่จะใช้หนึ่งในสองอย่างนี้ในระบบฝังตัวของเราเพื่อจัดเก็บไฟล์กำหนดค่า

ที่เกี่ยวข้อง:

ฉันควรใช้ YAML หรือ JSON เพื่อจัดเก็บข้อมูล Perl ของฉันหรือไม่


26
โปรดทราบว่า JSON ถือได้ว่าเป็นส่วนหนึ่งของ YAML: en.wikipedia.org/wiki/JSON#YAML
ชาร์ลส์

2
@Charles ใช่ แต่พวกเขามีบางอย่างที่แตกต่างที่ลึกซึ้ง: ajaxian.com/archives/json-yaml-its-getting-closer-to-truth
pierrotlefou

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

@ jokoon ฉันเดาว่า "ฉันชอบไลบรารี่ C" (เช่น libyaml)
dbr

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

คำตอบ:


656

เทคนิค YAML เป็นชุดของ JSON ซึ่งหมายความว่าอย่างน้อยในทางทฤษฎีแล้วโปรแกรมแยกวิเคราะห์ YAML สามารถเข้าใจ JSON ได้ แต่ไม่จำเป็นต้องเป็นอย่างอื่น

ดูรายละเอียดอย่างเป็นทางการในส่วนที่ชื่อว่า"YAML: ความสัมพันธ์กับ JSON"

โดยทั่วไปมีบางสิ่งที่ฉันชอบเกี่ยวกับ YAML ที่ไม่มีใน JSON

  • ในฐานะที่เป็น@jdupont ชี้ให้เห็น , YAML เป็นสายตาง่ายต่อการดูที่ ในความเป็นจริงหน้าแรกของ YAMLนั้นใช้ได้กับ YAML แต่มนุษย์อ่านได้ง่าย
  • YAML มีความสามารถในการอ้างอิงรายการอื่น ๆ ภายในไฟล์ YAML โดยใช้ "จุดยึด" ดังนั้นจึงสามารถจัดการข้อมูลเชิงสัมพันธ์ได้เนื่องจากอาจพบในฐานข้อมูล MySQL
  • YAML มีประสิทธิภาพมากกว่าเกี่ยวกับการฝังรูปแบบการทำให้เป็นอนุกรมอื่น ๆ เช่น JSON หรือ XML ภายในไฟล์ YAML

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

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

คุณจะพบไลบรารี C สำหรับทั้ง JSON และ YAML ห้องสมุดของ YAML มีแนวโน้มที่จะใหม่กว่า แต่ฉันไม่เคยมีปัญหากับพวกเขาในอดีต ดูตัวอย่างyaml-CPP


199
json ไม่ใช่เซตย่อย (แม้ว่าจะใกล้เคียงกัน) และความเข้ากันไม่ได้นั้นกำลังทำให้โกรธเมื่อคุณเข้ารหัสมัน โดยทั่วไปไลบรารี json จะเร็วกว่า ... ( stackoverflow.com/questions/2451732/… ) ผู้เสนอ yaml จะยืนยันว่าเป็นเซตย่อย หากการอ่านเป็นปัญหาให้ใช้ yaml หากข้อกังวลเกี่ยวกับการทำงานร่วมกันและความเร็วให้ใช้ JSON
Erik Aronesty

6
YAML เป็นชุดของรูปแบบเฉพาะของไวยากรณ์ JSON นั่นคือถ้าคุณใช้ JSON ในลักษณะที่เข้ากันได้กับ YAML แสดงว่าเป็นเซตย่อยที่เหมาะสม ตามที่ pierr ได้แสดงความคิดเห็นไว้ข้างต้นรายละเอียดคือ [เล็งไปที่ความเข้ากันได้] (ajaxian.com/archives/json-yaml-its-getting-closer-to-truth)
naught101

120
YAML ยังสนับสนุนความคิดเห็นที่มีประโยชน์
Den

59
@ErikAronesty JSON ใกล้กับชุดย่อยของ YAML 1.1 แต่เนื่องจาก YAML 1.2 เป็นชุดย่อยจริง YAML 1.2 ถูกปล่อยออกมาเพื่อรีดความไม่ลงรอยกันระหว่างสองคุณสมบัติสุดท้าย
00prometheus

64
จากสเปค YAML 1.2 : "วัตถุประสงค์หลักของการแก้ไขนี้คือการนำ YAML ไปปฏิบัติตาม JSON เป็นชุดย่อยอย่างเป็นทางการ"
Rich C

204

แตกต่าง:

  1. YAML ขึ้นอยู่กับวิธีการใช้งานของคุณซึ่งสามารถอ่านได้มากกว่า JSON
  2. JSON นั้นเร็วขึ้นและอาจทำงานร่วมกับระบบอื่น ๆ ได้มากกว่า
  3. เป็นไปได้ที่จะเขียนตัวแยกวิเคราะห์ JSON "ดีพอ" อย่างรวดเร็ว
  4. คีย์ซ้ำซึ่งอาจเป็นJSON ที่ถูกต้องนั้นเป็นYAML ที่ไม่ถูกต้องอย่างแน่นอน
  5. YAML มีฟีเจอร์มากมายรวมถึงความคิดเห็นและแองเคอร์สัมพันธ์ ไวยากรณ์ของ YAML นั้นค่อนข้างซับซ้อนและยากที่จะเข้าใจ
  6. เป็นไปได้ที่จะเขียนโครงสร้างแบบเรียกซ้ำใน yaml: {a: &b [*b]}ซึ่งจะวนซ้ำในตัวแปลงบางส่วน แม้จะมีการตรวจจับแบบวงกลม แต่ก็ยังคงมี "ระเบิด yaml" (ดูระเบิด xml )
  7. เนื่องจากไม่มีการอ้างอิงจึงเป็นไปไม่ได้ที่จะจัดลำดับโครงสร้างที่ซับซ้อนด้วยการอ้างอิงวัตถุใน JSON การทำให้เป็นอนุกรมของ YAML อาจมีประสิทธิภาพมากกว่า
  8. ในบางสภาพแวดล้อมการเข้ารหัสการใช้ YAML สามารถอนุญาตให้ผู้โจมตีเรียกใช้รหัสโดยอำเภอใจ

ข้อสังเกต:

  1. โปรแกรมเมอร์ไพ ธ อนเป็นแฟนตัวยงของ YAML เนื่องจากการใช้การเยื้องแทนที่จะเป็นไวยากรณ์ที่อยู่ในวงเล็บเพื่อระบุระดับ
  2. โปรแกรมเมอร์จำนวนมากพิจารณาถึงการแนบ "ความหมาย" เพื่อเยื้องทางเลือกที่ไม่ดี
  3. หากรูปแบบข้อมูลจะออกจากสภาพแวดล้อมของแอปพลิเคชันแยกวิเคราะห์ภายใน UI หรือส่งในเลเยอร์การส่งข้อความ JSON อาจเป็นทางเลือกที่ดีกว่า
  4. YAML สามารถใช้โดยตรงสำหรับงานที่ซับซ้อนเช่นคำจำกัดความของไวยากรณ์และมักจะเป็นทางเลือกที่ดีกว่าการประดิษฐ์ภาษาใหม่

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

32
@SFEley The YAML Spec บอกว่าอาจมีไฟล์ JSON ที่ถูกต้องที่อาจเป็น YAML แต่ก็ไม่น่าจะใช้งานได้จริง "RFC4627 ของ JSON ต้องการคีย์การแมปเฉพาะ" SHOULD "จะไม่ซ้ำกันในขณะที่ YAML ยืนยันว่าพวกเขา" ต้อง "เป็นในทางเทคนิค YAML จึงสอดคล้องกับสเปคของ JSON โดยเลือกปฏิบัติซ้ำเนื่องจากข้อผิดพลาดในทางปฏิบัติเนื่องจาก JSON ความหมายของการซ้ำซ้อนไฟล์ JSON แบบพกพาเท่านั้นคือไฟล์ที่มีคีย์เฉพาะซึ่งเป็นไฟล์ YAML ที่ถูกต้อง " - yaml.org/spec/1.2/spec.html#id2759572
David C. Bishop

9
แสดงความคิดเห็นในการใช้เยื้อง; ฉันเชื่อว่าอาจต้องใช้ความคุ้นเคยและไม่ใช่ทุกคนที่ต้องการ ตัวอย่างเช่นฉันเป็น. NET ฉันกำลังดูไฟล์ travis.yml และสงสัยว่าทำไมมีปัญหา ฉันพบว่าฉันมีแท็บที่ไม่ควรอยู่นอก ไม่ใช่ทุกคนที่คุ้นเคยกับสิ่งต่าง ๆ ที่เกิดขึ้นเนื่องจากการกำหนดค่าพื้นที่ / แท็บ / บรรทัดใหม่
Phil

10
ไม่อนุญาตให้ใช้แท็บใด ๆ เลยเนื่องจากเป็นอักขระที่มีการย่อหน้า IMHO นั่นเป็นรูปแบบการเข้ารหัสที่ดีในทุกภาษา - มีหรือไม่มีการเยื้องประโยค
00prometheus

6
@Wyrmwood ฉันชอบงูใหญ่และ YAML และใช้มันอย่างแท้จริงทุกวัน ฉันมักจะใช้ YAML สำหรับสิ่งที่ผู้คนต้องแก้ไขบ่อยๆและ JSON สำหรับสิ่งที่คน "อาจ" ต้องดู ฉันได้รับการวิจารณ์ที่ถูกต้องโดย C ++ devs ที่พบว่าการเยื้องจะทำให้เกิดความสับสน .... โดยเฉพาะอย่างยิ่งหากมีหลายระดับหรือบล็อกฟังก์ชั่นอีกต่อไป แน่นอน ... รหัสที่ทดสอบได้ดีไม่มีสิ่งเหล่านั้นดังนั้นจึงไม่ใช่ปัญหา นี่คือการสังเกตส่วนบุคคลของฉัน แต่การค้นหา google ทั่วไปใด ๆ จะให้ผลลัพธ์มากมาย ...
Erik Aronesty

89

ข้ามทฤษฎีความลับ

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

  1. YAML ใช้การเว้นวรรคซึ่งเป็นอาณาเขตที่คุ้นเคยสำหรับนักพัฒนา Python
  2. นักพัฒนา JavaScript ชื่นชอบ JSON เพราะเป็นชุดย่อยของ JavaScript และสามารถตีความและเขียนได้โดยตรงใน JavaScript พร้อมกับใช้วิธีย่อเพื่อประกาศ JSON โดยไม่ต้องใส่เครื่องหมายอัญประกาศคู่ในคีย์เมื่อใช้ชื่อตัวแปรทั่วไปโดยไม่มีช่องว่าง
  3. มีตัวแยกวิเคราะห์มากมายที่ทำงานได้ดีในทุกภาษาสำหรับทั้ง YAML และ JSON
  4. รูปแบบพื้นที่ของ YAML นั้นง่ายต่อการดูในหลาย ๆ กรณีเพราะการจัดรูปแบบนั้นต้องใช้วิธีการที่มนุษย์อ่านได้มากขึ้น
  5. รูปแบบของ YAML ในขณะที่กะทัดรัดและดูง่ายกว่านั้นอาจเป็นการยากที่จะแก้ไขด้วยมือหากคุณไม่มีการจัดรูปแบบพื้นที่ที่มองเห็นได้ในเครื่องมือแก้ไขของคุณ แท็บไม่ใช่ช่องว่างเพื่อให้เกิดความสับสนเพิ่มเติมหากคุณไม่มีเครื่องมือแก้ไขเพื่อตีความการกดแป้นของคุณลงในช่องว่าง
  6. JSON นั้นเร็วกว่ามากในการทำให้เป็นอนุกรมและไม่เป็นอนุกรมเนื่องจากคุณสมบัติน้อยกว่า YAML ในการตรวจสอบซึ่งทำให้โค้ดที่เล็กลงและเบาลงในการประมวลผล JSON
  7. ความเข้าใจผิดที่พบบ่อยคือ YAML ต้องการเครื่องหมายวรรคตอนที่น้อยกว่าและมีขนาดกะทัดรัดกว่า JSON แต่นี่เป็นเท็จโดยสมบูรณ์ ช่องว่างมองไม่เห็นดังนั้นดูเหมือนว่าจะมีตัวอักษรน้อยลง แต่ถ้าคุณนับช่องว่างที่แท้จริงซึ่งจำเป็นต้องมีเพื่อให้ YAML ถูกตีความอย่างเหมาะสมพร้อมกับการเยื้องที่เหมาะสมคุณจะพบว่า YAML ต้องการตัวอักษรมากกว่า JSON JSON ไม่ได้ใช้ช่องว่างเพื่อเป็นตัวแทนของลำดับชั้นหรือการจัดกลุ่มและสามารถแบนได้อย่างง่ายดายด้วยการลบช่องว่างที่ไม่จำเป็นสำหรับการขนส่งที่กะทัดรัดมากขึ้น

ช้างในห้อง: อินเทอร์เน็ตเอง

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

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


10
ฉันไม่เห็นด้วยที่นักพัฒนางูใหญ่ชอบ YAML Pythons dict นั้นมีพื้นฐาน JSON รายการของ dicts นั้นก็คือ JSON Python มีบิลด์ใน json lib ในหมายเหตุด้านข้างฉันเป็นนักพัฒนางูหลามและฉันชอบ JSON (นักพัฒนางูหลามส่วนใหญ่ฉันรู้ว่าชอบ JSON)
karantan

6
สิ่งหนึ่งที่รบกวนจิตใจฉันอย่างแท้จริงเกี่ยวกับพื้นที่สีขาวคือวิธีที่ง่ายที่จะสับสนและเข้าใจผิดว่าเป็นการเยื้องหรืออาจหมายถึงการซ้อนกันหรืออยู่ในระดับเดียวกันและยังง่ายต่อการผิดพลาดหากคุณไม่ มีกฎคู่มือ มันเหมือนกับโอ๊ะซที่ซ่อนอยู่นี่ไม่ใช่สถานการณ์แบบง่าย ๆ ที่ไม่มีใครพูดว่าเมื่อแก้ไข yaml ไม่เคยมีปัญหากับ json
Jason Sebring

6
@JasonSebring คุณเกือบจะสงสัยว่าทำไม YAML ถึงมีช่องว่าง 'การจุ่มลงในมหาสมุทร' ครั้งแรกของฉันของ YAML นำไปสู่แอปที่เสียหาย ... ทั้งหมดเกิดจากช่องว่าง คุณอาจคิดว่าอาจใช้การเยื้องที่ไม่ได้ใช้ตัวอักษรที่ไม่ใช่การพิมพ์จะทำให้มีความหมายมากขึ้น! (นั่นคือทำไมพวกเขาไม่เลือก 'บนโลก' แทนที่จะเป็น '') เพื่อที่จะเข้าใจ YAML คุณต้องไปดูรายละเอียด เพื่อให้เข้าใจ JSON ไม่จำเป็นต้องใช้สิ่งนั้น (ฉันเคยไปที่อดีตและไม่เคยหลัง) สิ่งนี้สำหรับฉันบ่งบอกถึงรูปแบบที่ไม่ใช่ "มนุษย์อ่านได้"
cmroanirgo

7
@cmroanirgo ใช่นี่คือประสบการณ์ของฉัน เจ้านายของฉันบังคับให้เราใช้ YAML เหนือ JSON และทำให้สิ่งที่ไม่จำเป็นต้องแก้ไขและนำเข้ามา ฉันเขียนสิ่งนี้เพราะการที่หวังว่าการโหวตจะพิสูจน์ให้ฉันเห็น
Jason Sebring

3
ปัญหาเกี่ยวกับแท็บใน YAML หมายถึง (a) ไม่อ่านข้อความแสดงข้อผิดพลาดและ (b) มีตัวแก้ไขที่ไม่ไฮไลต์แท็บ ปัญหาทั้งสองนี้แก้ไขได้อย่างง่ายดายดังนั้นฉันจึงไม่เข้าใจข้อร้องเรียน
toolforger

38

คำถามนี้มีอายุ 6 ขวบ แต่แปลกไม่มีคำตอบใดที่ตอบโจทย์ทั้งสี่ (ความเร็วหน่วยความจำการแสดงออกการพกพา)

ความเร็ว

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

อย่างไรก็ตามเนื่องจากไฟล์ YAML อาจมีขนาดเล็กกว่าไฟล์ JSON เล็กน้อย (เนื่องจากน้อยกว่า"และ,ตัวอักษร) เป็นไปได้ว่าตัวแยกวิเคราะห์ YAML ที่ปรับให้เหมาะสมที่สุดอาจเร็วกว่าในสถานการณ์พิเศษ

หน่วยความจำ

โดยทั่วไปแล้วจะมีการโต้แย้งเดียวกัน เป็นการยากที่จะดูว่าทำไมตัวแยกวิเคราะห์ YAML จะมีประสิทธิภาพของหน่วยความจำมากกว่าตัวแยกวิเคราะห์ JSON หากพวกเขาเป็นตัวแทนของโครงสร้างข้อมูลเดียวกัน

ลึกซึ้ง

ตามที่ระบุไว้โดยคนอื่น ๆ โปรแกรมเมอร์ Python มักจะชอบ YAML และโปรแกรมเมอร์ JavaScript ที่มีต่อ JSON ฉันจะทำการสังเกตเหล่านี้:

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

ความเบา

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

สรุป

JSON เป็นผู้ชนะด้านประสิทธิภาพ (ถ้าเกี่ยวข้อง) และการทำงานร่วมกัน YAML ดีกว่าสำหรับไฟล์ที่มนุษย์ดูแล HJSONเป็นการประนีประนอมที่ดีแม้ว่าจะมีการพกพาลดลงมาก JSON5เป็นการประนีประนอมที่สมเหตุสมผลมากขึ้นด้วยไวยากรณ์ที่กำหนดไว้อย่างดี


3
ฉันคิดว่า YAML ตัวเล็กกว่าเพราะตัวละครที่มองไม่เห็นที่หลอกฉันเช่นนี้ Invisible => ไม่อยู่ตรงนั้นไม่จริง หากคุณนับตัวละครที่มองไม่เห็นที่ต้องอยู่โดยเฉพาะอย่างยิ่งเมื่อ YAML ได้รับการทำรังมากขึ้นมันจะเกิน JSON อย่างรวดเร็ว ฉันแค่คิดว่ามันน่าสนใจมากเพราะคนโง่ส่วนมากที่เราอ่านได้กลายเป็นความคิดนั้นจนกระทั่งฉันคิดถึงมันจริงๆเพราะคุณสามารถทำให้ JSON และ YAML แบนได้ไม่มากนัก ฉันยังพบว่า YAML เป็นเรื่องยากมากที่จะแก้ไขด้วยมือไม่ใช่อ่านเพียงแก้ไขตามที่คุณต้องการเปิดใช้งานตัวแก้ไขคู่มือ
Jason Sebring

1
ฉันรู้สึกว่าไม่มีคำตอบใด ๆ ที่นี่ระบุไว้อย่างชัดเจนว่า: "สำหรับไฟล์การตั้งค่า / ปรับแต่ง YAML ดีกว่า (สำหรับเหตุผลที่กล่าวถึงข้างต้นโดยทุกคน) สำหรับเครื่อง / การใช้งาน interop ใช้ JSON" กล่าวอีกนัยหนึ่ง: ถ้ากลุ่มเป้าหมายของคุณเป็นมนุษย์ YAML จะดีกว่า หากเป้าหมายเป็นโปรแกรมอื่น (แต่คุณยังต้องการให้ข้อมูลสามารถอ่านได้โดยมนุษย์) ให้ใช้ JSON
Florin T.

นั่นเป็นเรื่องจริง แต่คำถามได้วางพารามิเตอร์ที่เฉพาะเจาะจงบางอย่างเกี่ยวกับวิธีที่พวกเขาต้องการเปรียบเทียบทั้งสอง โดยส่วนตัวฉันจะไม่ใช้ YAML เพื่ออะไร ฉันอาจใช้ JSON เพื่อการทำงานร่วมกันหรือ JSON6 หากการบำรุงรักษาของมนุษย์มีความสำคัญ
Steve Bennett

29

GIT และ YAML

คำตอบอื่น ๆ เป็นสิ่งที่ดี อ่านก่อน แต่ฉันจะเพิ่มอีกหนึ่งเหตุผลอื่นที่จะใช้ YAML บางครั้ง: คอมไพล์

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

แน่นอนว่าไฟล์ JSON นั้นสามารถ "ทำให้สวย" โดยการเรียงลำดับสตริง / คีย์และเพิ่มการเยื้อง แต่นี่ไม่ใช่ค่าเริ่มต้นและฉันขี้เกียจ

โดยส่วนตัวแล้วฉันใช้ JSON สำหรับการโต้ตอบระหว่างระบบกับระบบ ฉันมักจะใช้ YAML สำหรับไฟล์ปรับแต่ง, ไฟล์คงที่และไฟล์ที่ถูกติดตาม (โดยทั่วไปฉันยังหลีกเลี่ยงการเพิ่มแองเคอเรจสัมพันธ์ของ YAML ชีวิตสั้นเกินไปที่จะตามล่าลูป)

นอกจากนี้หากความกังวลเกี่ยวกับความเร็วและพื้นที่ฉันไม่ได้ใช้ คุณอาจต้องการดู BSON


22

ฉันเห็นว่า YAML ง่ายต่อการมองเห็น: วงเล็บน้อยกว่า "" ฯลฯ แม้ว่าจะมีแท็บที่น่ารำคาญใน YAML ... แต่ใคร ๆ ก็เข้าใจแล้ว

ในแง่ของประสิทธิภาพ / ทรัพยากรฉันไม่คาดหวังความแตกต่างอย่างมากระหว่างสองสิ่งนี้

ยิ่งไปกว่านั้นเรากำลังพูดถึงไฟล์การกำหนดค่าและดังนั้นฉันจะไม่คาดหวังว่ากิจกรรมการเข้ารหัส / ถอดรหัสความถี่สูงใช่ไหม?


22
ผมสงสัยว่าสิ่งที่คุณหมายโดยการแกล้งของแท็บ ผมเชื่อว่าสิ่งที่เป็นอักขระแท็บไม่ได้รับอนุญาตใน yamlซึ่งส่วนตัวผมคิดว่าเป็นความคิดที่ดีในแฟ้มแหล่งใด
poolie

6
@poolie: jldupont น่าจะหมายถึงwhitespace นำที่สำคัญใน syntacticallyใน YAML
naught101

10
ตกลง แต่ไม่ใช่แท็บ
poolie

20

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


3
YAML ซับซ้อนมากขึ้นในทางใด
Accatyyc

18
ตัวอย่างเช่น YAML สนับสนุนแองเคอร์ตามที่ได้รับการบันทึกไว้ในคำตอบอื่น มีคุณสมบัติอื่น ๆ เช่นชนิดข้อมูลที่ขยายได้ สิ่งนี้ทำให้การแยกวิเคราะห์มีความซับซ้อนมากขึ้นและอธิบายว่าทำไม YAML จึงมีข้อมูลจำเพาะที่ใหญ่กว่า มันอาจส่งผลเสียต่อประสิทธิภาพการทำงานโดยขึ้นอยู่กับการแยกวิเคราะห์ (ดูที่คำถามนี้: stackoverflow.com/questions/2451732/… )
Anton Strogonoff

5
ความซับซ้อนนั้นดีกว่าความเรียบง่ายถ้าความซับซ้อนนั้นซื้อให้คุณเพื่อให้ได้ความเรียบง่ายโดยรวมที่มากขึ้น นั่นเป็นเรื่องจริงขึ้นอยู่กับความซับซ้อนของแบบจำลองข้อมูลของคุณ
Jonathan Neufeld

3
ฉันอาจจะสายไปหน่อย แต่ YAML สามารถเพิ่มความคิดเห็นได้ในขณะที่ JSON ทำไม่ได้ สำหรับฉันมันเป็นความช่วยเหลือที่ยิ่งใหญ่เมื่อมาถึงเอกสารข้อกำหนด
Moses Liao GZ

@Accatyyc ฉันคิดว่าความจริงที่ว่าผู้คนที่นี่กำลังถามคำถามเกี่ยวกับความแตกต่างนั้นเป็นสัญญาณที่แน่นอนว่า YAML ไม่ใช่ทุกอย่างที่ง่าย ฉันไม่เคยถามคำถามเกี่ยวกับ JSON (ยกเว้น "ทำไมฉันจึงไม่สามารถแสดงความคิดเห็นได้?")
cmroanirgo

15

ในทางเทคนิคYAML ให้บริการมากกว่าJSON (YAML v1.2 เป็นชุดของ JSON):

  • แสดงความคิดเห็น
  • จุดยึดและการสืบทอด - ตัวอย่าง 3 รายการที่เหมือนกัน:

    item1: &anchor_name
      name: Test
      title: Test title
    item2: *anchor_name
    item3:
      <<: *anchor_name
      # You may add extra stuff.
  • ...

ส่วนใหญ่เวลาคนจะไม่ใช้คุณลักษณะพิเศษเหล่านั้นและความแตกต่างที่สำคัญคือYAML ใช้เยื้องขณะJSON ใช้วงเล็บ สิ่งนี้ทำให้ YAML กระชับและอ่านง่ายขึ้น (สำหรับตาที่ผ่านการฝึกอบรม)

เลือกแบบไหน

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

4

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


ฉันไม่ใช้ JSON ฉันใช้ JSON ที่เทียบเท่าโดยไม่เรียกว่า JSON ฉันเรียกมันว่า PS-OFF คุณจะฟ้องฉันเพื่อใช้{ "": #, [] }???
Andrew

4

บางครั้งคุณไม่ต้องตัดสินใจอีกคนหนึ่ง

ยกตัวอย่างเช่นใน Go คุณสามารถมีทั้งสองอย่างในเวลาเดียวกัน:

type Person struct {
    Name string `json:"name" yaml:"name"`
    Age int `json:"age" yaml:"age"`
}

3

จาก: Arnaud Lauret Book“ การออกแบบ Web APIs” :

รูปแบบข้อมูล JSON

JSONเป็นรูปแบบข้อมูลข้อความตามที่ภาษาการเขียนโปรแกรม JavaScript อธิบายข้อมูล แต่ถึงแม้ว่าชื่อจะเป็นภาษาที่ไม่ขึ้นกับภาษาอย่างสมบูรณ์ (ดูhttps://www.json.org/ ) เมื่อใช้JSONคุณสามารถอธิบายวัตถุที่มีคู่ชื่อ / ค่าที่ไม่เรียงลำดับและยังมีอาร์เรย์หรือรายการที่มีค่าสั่งซื้อดังที่แสดงในรูปนี้

ป้อนคำอธิบายรูปภาพที่นี่

วัตถุถูกคั่นด้วยเครื่องหมายปีกกา ({}) ชื่อเป็นสตริงที่ยกมา ("ชื่อ") และแยกจากค่าของมันโดยโคลอน (:) ค่าสามารถเป็นสตริงเช่น "value", จำนวนเช่น 1.23, บูลีน (จริงหรือเท็จ), ค่า null เป็นโมฆะ, วัตถุหรืออาร์เรย์ อาร์เรย์ถูกคั่นด้วยวงเล็บ ([]) และค่าจะถูกคั่นด้วยเครื่องหมายจุลภาค (,) JSONรูปแบบจะแยกกันได้ง่ายโดยใช้ภาษาการเขียนโปรแกรมใด ๆ นอกจากนี้ยังง่ายต่อการอ่านและเขียน มันถูกนำมาใช้อย่างกว้างขวางสำหรับการใช้งานหลายอย่างเช่นฐานข้อมูลไฟล์การกำหนดค่าและแน่นอน APIs

YAML

YAML (YAML ไม่ใช่ภาษามาร์กอัป) เป็นรูปแบบข้อมูลที่เป็นมิตรกับมนุษย์ เช่นเดียวกับ JSON YAML ( http://yaml.org ) เป็นรูปแบบข้อมูลคีย์ / ค่า รูปแสดงการเปรียบเทียบของทั้งสอง

ป้อนคำอธิบายรูปภาพที่นี่

หมายเหตุประเด็นต่อไปนี้:

  • มีคำพูดที่ไม่มีคู่ (" ") รอบชื่อคุณสมบัติและค่านิยมในการมีYAML

  • JSON ของวงเล็บปีกกาโครงสร้าง ({}) และเครื่องหมายจุลภาค (,) จะถูกแทนที่ด้วยการขึ้นบรรทัดใหม่และย่อหน้าในYAML

  • วงเล็บ array ([]) และเครื่องหมายจุลภาค (,) จะถูกแทนที่ด้วยขีดกลาง (-) และการขึ้นบรรทัดใหม่ใน YAML

  • ซึ่งแตกต่างจากJSON , YAMLช่วยให้ความคิดเห็นเริ่มต้นด้วยเครื่องหมายแฮช (#) มันค่อนข้างง่ายที่จะแปลงรูปแบบหนึ่งไปเป็นอีกรูปแบบหนึ่ง จะ forewarned แม้ว่าคุณจะสูญเสียความคิดเห็นเมื่อแปลงYAMLเอกสารJSON


0

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

ในท้ายที่สุดแล้วมันไม่สำคัญเลย ทั้ง JSON และ YAML สามารถอ่านได้ง่ายโดยโปรแกรมเมอร์ผู้มีประสบการณ์


-1
  • JSON ไม่สามารถจัดการข้อมูลขนาดใหญ่เมื่อเปรียบเทียบ yml

  • ไม่เหมาะสำหรับการจัดการรูปแบบมัลติมีเดียที่แตกต่างกัน

  • JSON ไม่มีคุณสมบัติในการสนับสนุน 'ความคิดเห็น' อาจรวมเป็นแอตทริบิวต์เพิ่มเติมเพียงอย่างเดียว

  • YAML มีข้อได้เปรียบเหนือ JSON เช่นการอ้างอิงตนเองการสนับสนุนประเภทข้อมูลที่ซับซ้อนตัวอักษรบล็อกฝังความคิดเห็นและอื่น ๆ

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

คุณหมายความว่าอย่างไรกับ "ข้อมูลขนาดใหญ่" และจุด "อ่านได้อย่างเดียว"? JSON เป็นรูปแบบข้อมูลแนวคิดนามธรรมสามารถมีข้อ จำกัด สองข้อนี้ได้อย่างไร
João Farias

4
@ JoãoFariasสมมติว่าคุณมีไฟล์ 1GB JSON และไฟล์ CSV 1GB และคุณมีหน่วยความจำ 256MB คุณสามารถประมวลผลไฟล์ CSV ทีละบรรทัดด้วย JSON มันเป็นไปไม่ได้ง่าย มันอาจจะง่ายกว่าในการแยกไฟล์ YAML ทีละบรรทัดกว่าการแยกวิเคราะห์ JSON จะเป็น
NeverEndingQueue
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.