- Sj.h เป็น ตัวพาร์ส JSON แบบเบามาก ที่มีขนาดเพียงประมาณ 150 บรรทัด และใช้งานได้ในสภาพแวดล้อมที่รองรับ C99
- มีจุดเด่นอย่าง ไม่จัดสรรหน่วยความจำเลย และ เก็บสถานะให้น้อยที่สุด จึงเหมาะกับสภาพแวดล้อมแบบ embedded ที่ต้องการความเบาและการพึ่งพาภายนอกให้น้อยที่สุด
- ใช้วิธีให้ผู้ใช้จัดการ การพาร์สตัวเลขและสตริง เองโดยตรง จึงสามารถออกแบบการทำงานส่วนที่เกี่ยวข้องได้อย่างอิสระ
- รองรับ ข้อความผิดพลาดแบบบรรทัด:คอลัมน์ ทำให้ ดีบัก ได้อ่านง่ายและระบุตำแหน่งปัญหาได้ชัดเจน
- เป็นซอฟต์แวร์สาธารณสมบัติที่ทุกคนสามารถ ใช้งาน แก้ไข และเผยแพร่ต่อได้อย่างอิสระ
แนะนำโปรเจกต์
- Sj.h คือไฟล์เฮดเดอร์ C99 ที่ให้ความสามารถในการพาร์ส JSON ด้วย โค้ดเท่าที่จำเป็น โดยไม่มีฟีเจอร์ส่วนเกินหรือการจัดสรรหน่วยความจำที่ไม่จำเป็น
- การติดตั้งใช้งานทั้งหมดมีขนาดเพียงประมาณ 150 บรรทัด จึงเหมาะกับระบบ embedded, เครื่องมือขนาดเล็ก หรือกรณีที่ต้องการลดการพึ่งพาไลบรารีภายนอก
คุณสมบัติหลัก
- ทำงานแบบ zero-allocations และ minimal state จึงมีภาระด้านหน่วยความจำน้อยมาก
- มี ข้อความผิดพลาด ที่มาพร้อมข้อมูล บรรทัด:คอลัมน์ ทำให้ตรวจหาตำแหน่งปัญหาระหว่างการพาร์สได้ง่าย
- ไม่มีตัวพาร์สตัวเลขมาให้โดยตรง ผู้ใช้จึงสามารถเลือกใช้วิธีที่ต้องการเอง เช่น strtod, atoi
- การพาร์สสตริงก็สามารถทำเองได้โดยตรง หรือจะสร้างการรองรับอย่าง Unicode surrogate pair ตามความต้องการก็ได้
- ซอร์สโค้ดทั้งหมดเผยแพร่แบบสาธารณสมบัติ (Unlicense) จึงสามารถใช้งานและแก้ไขได้โดยไม่มีข้อจำกัดด้านไลเซนส์
ตัวอย่างการใช้งาน
- มีตัวอย่างอย่างง่ายสำหรับพาร์สสตริง JSON ไปเป็นโครงสร้าง Rect
char *json_text = "{ \"x\": 10, \"y\": 20, \"w\": 30, \"h\": 40 }"; typedef struct { int x, y, w, h; } Rect; ... - ใช้ API ที่เรียบง่ายและตรงไปตรงมา เช่น sj_Reader, sj_Value, sj_reader, sj_read, sj_iter_object
- การพาร์สค่าตัวเลข หรือ การเปรียบเทียบคีย์-ค่า ต้องเขียนเอง (ไม่มี builtin ให้)
- สามารถดูตัวอย่างการใช้งานเพิ่มเติมได้ในโฟลเดอร์ demo
ไลเซนส์
- Sj.h เป็น ซอฟต์แวร์สาธารณสมบัติ ที่ทุกคนสามารถใช้งานได้โดยไม่มีข้อจำกัด
- รายละเอียดเพิ่มเติมดูได้ในไฟล์ LICENSE
อื่น ๆ
- โค้ดและโครงสร้างโฟลเดอร์เรียบง่าย จึงนำไปใช้ได้ทันทีโดยไม่ต้องมีขั้นตอนตั้งค่าหรือบิลด์เพิ่มเติม
- เป็นไลบรารีแบบอิสระ ไม่มีการพึ่งพาภายนอก และเหมาะกับสภาพแวดล้อมที่ต้องการทั้ง ความเบา และ ความสะดวกในการใช้งาน
1 ความคิดเห็น
ความเห็นจาก Hacker News
intในซอร์สเป็น 64 บิตทั้งหมดอยู่แล้ว แต่ต่อให้ทำแบบนั้น ถ้าอินพุตเกิน 2^64 ก็พังอยู่ดี ฉันคงไม่คิดจะใส่เช็กintoverflow ทีละจุดในโค้ดintเป็น 32 บิต ปัญหาจะเกิดก็ต่อเมื่อมีค่าซ้อนลึก 2 พันล้านชั้นในแต่ละบรรทัด, ไฟล์ที่มีมากกว่า 2 พันล้านบรรทัด, หรือบรรทัดเดียวที่ยาวเกิน 2 พันล้านอักขระ]และ}สำหรับปิด object หรือ array และยังนับ\vเป็น whitespace ด้วย เลยผ่อนปรนกว่ามาตรฐาน เหมาะจะมองว่าเป็น “ตัวดึงข้อมูลสำหรับ JSON ที่ถูกต้อง” มากกว่า แต่การต้องเขียน parser สำหรับ string หรือ number เองก็อาจน่ารำคาญ โดยเฉพาะเมื่อจำเป็นต้องตกลงกับฝั่งผู้ผลิตข้อมูลเรื่อง subset ของไวยากรณ์ JSON= { 0 }ไป จากโค้ดที่เกี่ยวข้อง ดูเหมือนว่าr->depthอาจยังไม่ถูก initialize และอาจบังเอิญเท่ากับdepthในลูปsj__discard_untilได้r->depthถูก initialize เป็น 0 ไว้ก่อนแล้ว ดูโค้ดที่เกี่ยวข้อง