หากเปรียบเทียบเอกสาร JSON สองฉบับด้วย diff ข้อความทั่วไป (แบบที่ใช้กับโค้ด) ผลลัพธ์มักทำให้เข้าใจผิด: ข้อมูลชุดเดียวกันสามารถเขียนด้วยลำดับคีย์ที่ต่างกัน การเยื้องที่ต่างกัน หรือจำนวนช่องว่างที่ต่างกัน — และ diff ข้อความจะแสดง "ความแตกต่าง" ในจุดที่ข้อมูลจริง ๆ เหมือนกันทุกประการ
การเปรียบเทียบเชิงโครงสร้าง
JSON Diff เชิงโครงสร้างจะแยกวิเคราะห์เอกสารทั้งสองเป็นโครงสร้างต้นไม้ของค่า และเปรียบเทียบข้อมูลจริง: ฟิลด์มีอยู่หรือไม่ มีค่าอะไร ประเภทตรงกันหรือไม่ ลำดับคีย์ของอ็อบเจกต์ ช่องว่างส่วนเกิน หรือรูปแบบการเยื้องจะไม่ถูกนำมาพิจารณา — สิ่งเหล่านี้ไม่ใช่ส่วนหนึ่งของข้อมูลเอง
diff แสดงอะไร
ผลลัพธ์ทั่วไปของการเปรียบเทียบเชิงโครงสร้างจะเน้นการเปลี่ยนแปลงสามประเภท: ฟิลด์ที่เพิ่มเข้ามาในเอกสารที่สอง ฟิลด์ที่ถูกลบออกจากเอกสารแรก และฟิลด์ที่มีอยู่ในทั้งสองแต่มีค่าต่างกัน สำหรับอาร์เรย์ การเปรียบเทียบซับซ้อนกว่า — ต้องตัดสินใจว่าจะเปรียบเทียบองค์ประกอบตามตำแหน่งหรือพยายามจับคู่อ็อบเจกต์ที่คล้ายกัน
เหตุใดจึงจำเป็น
- เปรียบเทียบการตอบกลับ API ก่อนและหลังการเปลี่ยนแปลงใน backend เพื่อดูความแตกต่างของข้อมูลที่แท้จริง
- ตรวจสอบว่าการเปลี่ยนแปลงในไฟล์การตั้งค่าไม่ได้กระทบสิ่งที่ไม่ตั้งใจ
- ค้นหาการถดถอยในการทดสอบที่ JSON ที่คาดหวังกับ JSON จริงแตกต่างกัน
ทำไมการอ่าน diff ของข้อความไทยถึงยากกว่าที่คิด
ภาษาไทยไม่มีการเว้นวรรคระหว่างคำและไม่มีแนวคิดตัวพิมพ์ใหญ่-เล็ก ซึ่งเป็นสิ่งที่คนอ่าน diff ภาษาอังกฤษหรือภาษาที่ใช้อักษรละตินมักใช้เป็นจุดสังเกตด้วยสายตาเมื่อสแกนหาจุดที่เปลี่ยนแปลงในบรรทัดยาว ๆ เมื่อ diff เชิงโครงสร้างไฮไลต์ค่าที่เปลี่ยนในฟิลด์ข้อความภาษาไทยยาว ๆ ผู้ตรวจสอบจึงต้องอ่านทั้งประโยคอย่างละเอียดแทนที่จะกวาดสายตาหาคำที่ขึ้นต้นด้วยตัวพิมพ์ใหญ่หรือช่องว่างที่เปลี่ยนไป นี่คือเหตุผลที่การไฮไลต์ตำแหน่งที่เปลี่ยนแปลงแบบละเอียดในเครื่องมือ diff มีประโยชน์กับข้อความไทยมากเป็นพิเศษ
การเปรียบเทียบอาร์เรย์: ตามตำแหน่งหรือตามคีย์
วิธีที่ง่ายที่สุดคือเปรียบเทียบสมาชิกของอาร์เรย์ทีละดัชนี แต่หากมีการแทรกสมาชิกใหม่เข้ากลางอาร์เรย์ ตำแหน่งที่เหลือทั้งหมดจะ "เลื่อน" และ diff จะแสดงว่าทุกสมาชิกหลังจุดแทรกเปลี่ยนแปลง ทั้งที่จริง ๆ มีเพียงสมาชิกเดียวที่เปลี่ยน เครื่องมือที่ฉลาดกว่าจะพยายามจับคู่สมาชิกตามฟิลด์เฉพาะตัว (เช่น id) เพื่อแสดงเฉพาะการแทรกหรือการลบจริง ๆ แทนที่จะเป็นความแตกต่างปลอมต่อเนื่อง