- Sj.h là một trình phân tích cú pháp JSON siêu nhẹ chỉ gồm khoảng 150 dòng, có thể dùng trong môi trường dựa trên C99
- Có các đặc điểm như không cấp phát bộ nhớ, duy trì trạng thái tối thiểu, nên phù hợp cho môi trường nhúng gọn nhẹ hoặc khi cần giảm tối đa phụ thuộc
- Áp dụng cách xử lý trực tiếp đối với phân tích số và chuỗi, cho phép người dùng tự do triển khai phần xử lý liên quan
- Hỗ trợ thông báo lỗi dựa trên dòng:cột, giúp debug dễ đọc hơn và dễ xác định vị trí hơn
- Là phần mềm thuộc phạm vi công cộng, cho phép mọi người tự do sử dụng, chỉnh sửa và phân phối
Giới thiệu dự án
- Sj.h là tệp header C99 cung cấp chức năng phân tích JSON chỉ với lượng mã tối thiểu, không có tính năng dư thừa hay cấp phát bộ nhớ không cần thiết
- Toàn bộ phần triển khai chỉ khoảng 150 dòng, phù hợp cho hệ thống nhúng, công cụ, hoặc các trường hợp muốn giảm phụ thuộc vào thư viện bên ngoài
Tính năng chính
- Hoạt động với không cấp phát bộ nhớ (zero-allocations) và trạng thái tối thiểu (minimal state) nên áp lực bộ nhớ rất thấp
- Thông báo lỗi có kèm thông tin dòng:cột, giúp dễ xác định vị trí sự cố phát sinh trong quá trình phân tích
- Không cung cấp sẵn phân tích số; người dùng có thể dùng cách mình muốn như strtod, atoi
- Phân tích chuỗi cũng có thể tự triển khai, hoặc xây dựng thêm xử lý Unicode surrogate pair tùy nhu cầu
- Toàn bộ mã nguồn được cung cấp theo public domain (Unlicense), nên có thể dùng và chỉnh sửa mà không bị ràng buộc về giấy phép
Ví dụ sử dụng
- Cung cấp ví dụ đơn giản về việc phân tích chuỗi JSON thành cấu trúc Rect
char *json_text = "{ \"x\": 10, \"y\": 20, \"w\": 30, \"h\": 40 }"; typedef struct { int x, y, w, h; } Rect; ... - Sử dụng các API đơn giản, rõ ràng như sj_Reader, sj_Value, sj_reader, sj_read, sj_iter_object
- Phân tích giá trị số hay so sánh key-value cần tự triển khai (không có builtin)
- Có thể xem thêm nhiều ví dụ sử dụng khác trong thư mục demo
Giấy phép
- Sj.h là phần mềm public domain mà ai cũng có thể sử dụng không hạn chế
- Xem thêm chi tiết trong tệp LICENSE
Khác
- Mã nguồn và cấu trúc thư mục đơn giản, có thể dùng ngay mà không cần bước cấu hình hay build riêng
- Độc lập, không có phụ thuộc bên ngoài, phù hợp chủ yếu với các môi trường yêu cầu tính gọn nhẹ và dễ sử dụng
1 bình luận
Ý kiến trên Hacker News
inttrong mã nguồn sang 64-bit, nhưng nếu đầu vào vượt quá 2^64 thì cuối cùng vẫn chết thôi, nên tôi không định đi kiểm traintoverflow ở mọi chỗ trong codeintlà 32-bit, chỉ khi mỗi dòng có độ lồng hơn 2 tỷ, hoặc file có hơn 2 tỷ dòng, hoặc một dòng dài hơn 2 tỷ ký tự thì mới thành vấn đề]lẫn}, và còn coi\vlà whitespace nên dễ dãi hơn chuẩn; có lẽ nên xem nó là một "bộ trích xuất dữ liệu cho JSON đúng" hơn; tuy nhiên tự viết parser cho string hay number cũng có thể khá phiền, nhất là khi cần thống nhất với bên sinh dữ liệu về một tập con cú pháp JSON nào đófloathayint, nên có vẻ bạn sẽ phải tự thêm phần đó; dù vậy vẫn rất ấn tượng và tôi sẵn sàng dùng thử, chỉ là muốn chỉ ra điểm đó thôi= { 0 }; nhìn đoạn code liên quan thì có vẻr->depthchưa được khởi tạo mà vẫn có thể tình cờ bằngdepthtrong vòng lặpsj__discard_untilr->depthđã được khởi tạo về 0 từ trước ở đây rồi, xem đoạn code liên quanstdbool.hvàstddef.hđể định nghĩa kiểu), không có trò template C++ rối rắm và API thì trực quan; thư viện C đáp ứng đủ các điều kiện này thực sự rất hiếm, C++ còn hiếm hơn