fixmint
TH

ข้อผิดพลาดของ JSON ที่ทำให้ parse ไม่ผ่านส่วนใหญ่ และวิธีแก้ไข

โดย · · อัปเดตเมื่อ 8 พฤศจิกายน 2026 · อ่าน 5 นาที

ข้อผิดพลาดในการ parse JSON ส่วนใหญ่มาจากความผิดพลาดกลุ่มสั้น ๆ ได้แก่ ลูกน้ำท้ายสุด สตริงที่ใช้เครื่องหมายคำพูดเดี่ยว คอมเมนต์ คีย์ที่ไม่มีเครื่องหมายคำพูดครอบ ค่าอย่าง NaN หรือ undefined และเครื่องหมายคำพูดโค้งที่คัดลอกมาจากเอกสาร JSON เข้มงวดกว่า JavaScript ที่คล้ายกันมาก โค้ดที่คนอ่านแล้วดูถูกต้องจึงอาจถูก parser ปฏิเสธได้ ข้อความแจ้งข้อผิดพลาดจะชี้ไปยังบรรทัดและคอลัมน์ และการแก้มักอยู่ที่ตำแหน่งนั้นหรือก่อนหน้านั้นเล็กน้อย

จัดรูปแบบ JSONJSON อ่านไม่ได้ ตรวจไม่ผ่านใช้ฟรี

กฎที่ JSON บังคับใช้

เอกสาร JSON คือค่าเดียว ได้แก่ ออบเจกต์ในวงเล็บปีกกา อาร์เรย์ในวงเล็บเหลี่ยม สตริง ตัวเลข true, false หรือ null ภายในค่าเหล่านั้น

  • คีย์และสตริงทุกตัวต้องใช้เครื่องหมายคำพูดคู่แบบตรง เช่น "name"
  • ลูกน้ำใช้คั่นรายการ และห้ามมีลูกน้ำหลังรายการสุดท้ายในออบเจกต์หรืออาร์เรย์
  • ตัวเลขห้ามมีเครื่องหมายบวกนำหน้า และ NaN, Infinity กับ undefined ไม่ใช่ตัวเลขหรือค่าที่ถูกต้อง
  • ห้ามใช้คอมเมนต์โดยเด็ดขาด
  • คีย์ต้องเป็นสตริง ดังนั้นคีย์ที่ไม่มีเครื่องหมายคำพูด เช่น name: จึงไม่ถูกต้อง

parser บางตัวยอมรับกฎเหล่านี้บางข้อเป็นค่าเริ่มต้น และบางเครื่องมือยอมรับ JSON ที่มีคอมเมนต์เพื่อความสะดวก ความยืดหยุ่นนี้ซ่อนปัญหาไว้จนไฟล์ไปถึงตัวอ่านที่เข้มงวดกว่า จึงควรเขียนในรูปแบบที่เข้มงวดตั้งแต่ต้น

อ่านข้อความแจ้งข้อผิดพลาด

parser จะรายงานตำแหน่งแรกที่ทำงานต่อไม่ได้ ข้อความจะบอกปัญหาและตำแหน่ง ซึ่งมักเป็นบรรทัดและคอลัมน์ ต่อไปนี้เป็นไฟล์เล็ก ๆ ที่มีลูกน้ำท้ายสุดในอาร์เรย์และอีกตัวหลังพร็อพเพอร์ตี้สุดท้าย

{
  "name": "Ada",
  "tags": ["a", "b",],
}

Python รายงานข้อนี้เป็น "Illegal trailing comma before end of array: line 3 column 20" ถ้อยคำจะต่างกันในแต่ละเครื่องมือ และ parser รุ่นเก่าบางตัวจะบอกเพียง "Unexpected token" พร้อมตำแหน่งตัวอักษร ให้ไปยังตำแหน่งที่ระบุ แล้วดูตัวอักษรก่อนหน้า ข้อผิดพลาดจริงมักเป็นลูกน้ำ เครื่องหมายคำพูด หรือวงเล็บที่อยู่ก่อนตำแหน่งนั้นไปหนึ่งหรือสองตัวอักษร

ข้อความอื่นจาก parser ของ Python และความหมายโดยทั่วไป

  • "Expecting property name enclosed in double quotes" สำหรับ '{'a': 1}' หมายความว่ามีคีย์ที่ใช้เครื่องหมายคำพูดเดี่ยวหรือไม่มีเครื่องหมายคำพูดเลย
  • "Expecting value" ที่ตำแหน่งที่คาดหวังตัวเลขหรือสตริง มักหมายความว่ามีเครื่องหมายคำพูดโค้ง เพราะ parser มองว่าเป็นอักขระที่ไม่รู้จัก
  • "Expecting ',' delimiter" มักหมายความว่าขาดลูกน้ำระหว่างรายการสองรายการ หรือมีคอมเมนต์อยู่กลางข้อมูล

เครื่องหมายคำพูดโค้งและข้อความที่คัดลอกมา

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

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

เครื่องหมายคำพูดเดี่ยว คอมเมนต์ และคีย์ที่ไม่มีเครื่องหมายคำพูด

นักพัฒนาจำนวนมากเขียนข้อมูลคล้าย JSON ในภาษาที่อนุญาตให้ทำได้มากกว่า

  • เครื่องหมายคำพูดเดี่ยวใช้ได้ใน literal ของ JavaScript และ Python แต่ JSON ต้องใช้เครื่องหมายคำพูดคู่ ให้เปลี่ยน {'a': 1} เป็น {"a": 1}
  • คอมเมนต์ เช่น // หรือ /* */ ต้องลบออก ถ้าต้องการโน้ต ให้ใส่ไว้ในฟิลด์แยกต่างหาก หรือใช้รูปแบบที่ออกแบบมาสำหรับไฟล์ตั้งค่า
  • คีย์ที่ไม่มีเครื่องหมายคำพูดพบบ่อยใน object literal ของ JavaScript ให้เพิ่มเครื่องหมายคำพูดครอบ
  • NaN และ undefined ไม่ใช่ JSON ให้ใช้ null สำหรับค่าที่ขาดหาย หรือใช้สตริงถ้าค่านั้นเป็นข้อความ

ระวังการค้นหาและแทนที่แบบทั้งหมด การเปลี่ยนเครื่องหมายคำพูดเดี่ยวทุกตัวเป็นคู่จะทำให้สตริงที่มีเครื่องหมายวรรคตอน เช่น "Ada's notes" เสียหาย ให้ดูทุกรายการที่ตรงกันในค้นหาและแทนที่ข้อความก่อน เพื่อเห็นว่าเครื่องหมายคำพูดใดจะเปลี่ยน

แก้โครงสร้างทีละขั้น

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

ไฟล์ที่ parse ผ่านอาจไม่ใช่ไฟล์ที่ตั้งใจไว้เสมอไปตรวจสอบกับ JSON Schemaเพื่อจับฟิลด์ที่หายไปหรือค่าที่ชนิดไม่ถูกต้อง หรือเปรียบเทียบเอกสาร JSON สองไฟล์เพื่อดูว่ามีอะไรเปลี่ยนไประหว่างเวอร์ชัน

กรณีพิเศษ

  • ลูกน้ำท้ายสุดในไฟล์ที่สร้างอัตโนมัติ เครื่องมือบางตัวเขียนลูกน้ำเหล่านี้ไว้ ถ้าคุณสร้าง JSON ด้วยการต่อสตริงด้วยมือ ให้ใช้ serializer ของภาษาที่คุณใช้ ซึ่งจะเขียนผลลัพธ์ที่ถูกต้อง
  • คีย์ซ้ำ JSON อนุญาตให้มีคีย์ซ้ำ แต่ parser ส่วนใหญ่จะเก็บเพียงค่าสุดท้าย คีย์ซ้ำจึงเป็นบั๊กที่รอให้เกิดปัญหา
  • ตัวเลขขนาดใหญ่ จำนวนเต็มที่มีค่ามากอาจสูญเสียความแม่นยำใน parser บางตัว ดังนั้นให้เก็บตัวระบุเป็นสตริงหากยาวเกินกว่าที่ parser จะแทนได้อย่างแม่นยำ คู่มือแปลง CSV เป็น JSON ให้ข้อสังเกตเดียวกันเกี่ยวกับ ID

คำตอบสั้น ๆ

ทำไม JSON ของฉันถึง parse ไม่ผ่านทั้งที่ดูถูกต้อง

สาเหตุที่พบบ่อยคือลูกน้ำท้ายสุด เครื่องหมายคำพูดเดี่ยว คอมเมนต์ หรือเครื่องหมายคำพูดโค้งที่คัดลอกมาจากเอกสาร ให้ตรวจตำแหน่งในข้อความแจ้งข้อผิดพลาดและตัวอักษรที่อยู่ก่อนตำแหน่งนั้น

JSON มีคอมเมนต์ได้ไหม

ไม่ได้ มาตรฐาน JSON ไม่อนุญาตให้มีคอมเมนต์ ให้ลบออก หรือย้ายโน้ตไปไว้ในฟิลด์ของตัวเอง ปุ่ม ซ่อมแซม ของตัวจัดรูปแบบจะลบให้อัตโนมัติ

ควรใช้อะไรแทน undefined ใน JSON

ใช้ null เมื่อค่าขาดหายโดยตั้งใจ หรือไม่ใส่คีย์นั้นเลย undefined เป็นค่าของ JavaScript และไม่มีรูปแบบแทนใน JSON

แปลจาก ฉบับภาษาอังกฤษ ด้วยความช่วยเหลือของ AI

ความคิดเห็น

    ยังไม่มีความคิดเห็น มาเป็นคนแรกกันเลย

    คะแนนของคุณ (ไม่บังคับ)

    อีเมลของคุณจะไม่ถูกแสดงหรือเก็บไว้

    ปกของ How to Remain Valuable When Intelligence Becomes CheapHow to Remain Valuable When Intelligence Becomes Cheap

    224 หน้าว่าด้วยข้อได้เปรียบของมนุษย์ ด้านเศรษฐกิจ และด้านกลยุทธ์ ที่ยังคงหายากแม้ AI จะทำงานด้านการคิดได้เกือบทั้งหมด

    $3.84ซื้อบน Gumroadฉบับภาษาอังกฤษ