- Sj.h es un parser JSON ultraligero de alrededor de 150 líneas, utilizable en entornos basados en C99
- Tiene características como cero asignaciones de memoria y estado mínimo, lo que lo hace conveniente para entornos embebidos ligeros o para minimizar dependencias
- Adopta un enfoque de manejo directo para el parsing de números y cadenas, permitiendo que el usuario implemente libremente el procesamiento relacionado
- Ofrece mensajes de error basados en línea:columna, lo que mejora la legibilidad y la identificación de ubicación al depurar
- Es software de dominio público, por lo que cualquiera puede usarlo libremente, modificarlo y distribuirlo
Introducción al proyecto
- Sj.h es un archivo de cabecera C99 que proporciona funcionalidad de parsing JSON con código mínimo, sin funciones excesivas ni asignaciones de memoria innecesarias
- La implementación completa tiene unas 150 líneas, por lo que es adecuada para sistemas embebidos, herramientas, o casos donde se quiera reducir la dependencia de bibliotecas externas
Características principales
- Funciona con cero asignaciones de memoria (zero-allocations) y estado mínimo (minimal state), por lo que la carga de memoria es muy baja
- Incluye mensajes de error con información de línea:columna, facilitando ubicar los problemas que ocurren durante el parsing
- No incluye parsing de números por defecto; el usuario puede usar el método que prefiera, como strtod, atoi
- El parsing de cadenas también puede implementarse directamente, o construir según necesidad el manejo de Unicode surrogate pairs, entre otros
- Todo el código fuente se ofrece como dominio público (Unlicense), por lo que puede usarse y modificarse sin restricciones de licencia
Ejemplo de uso
- Se proporciona un ejemplo simple para parsear una cadena JSON en una estructura Rect
char *json_text = "{ \"x\": 10, \"y\": 20, \"w\": 30, \"h\": 40 }"; typedef struct { int x, y, w, h; } Rect; ... - Usa una API simple y clara como sj_Reader, sj_Value, sj_reader, sj_read, sj_iter_object
- El parsing de valores numéricos o la comparación de clave-valor deben implementarse manualmente (no viene builtin)
- En la carpeta demo se pueden revisar varios ejemplos de uso adicionales
Licencia
- Sj.h es software de dominio público que cualquiera puede usar sin restricciones
- Para más detalles, consulta el archivo LICENSE
Otros
- Como el código y la estructura de carpetas son simples, puede usarse de inmediato sin configuración ni pasos de compilación adicionales
- Es independiente, no tiene dependencias externas, y resulta adecuado sobre todo para entornos donde se requiere ligereza y facilidad de uso
1 comentarios
Opiniones en Hacker News
.ini), json.lua (una biblioteca liviana de JSON para Lua), lite (un editor de texto liviano hecho en Lua), cmixer (un mezclador de audio portable para juegos) y uuid4 (una pequeña biblioteca uuid4 implementada en C)intdel código fuente a 64 bits; aun así, si la entrada supera2^64, al final igual se romperá. No planeo revisar manualmente cada overflow deinten el códigointes de 32 bits, solo habría problema si necesitas un valor anidado con 2 mil millones de niveles por línea, un archivo de más de 2 mil millones de líneas, o una sola línea de más de 2 mil millones de caracteresstrings, al final sí necesitas asignación; es una alternativa muy distinta a mi problema]o}para cerrar objetos o arrays, y también reconoce\vcomo whitespace, así que es más permisiva que el estándar. Lo correcto sería verla como un “extractor de datos para JSON válido”. Aun así, puede dar flojera tener que escribir por tu cuenta un parser de strings o números, sobre todo cuando necesitas acordar con el productor un subconjunto de la gramática JSONfloatoint, parece que uno mismo tendría que agregar esa parte. Aun así, me impresiona y sí tendría disposición a usarlo; solo quería señalar ese punto= { 0 }; viendo este código relacionado, parece quer->depthpodría coincidir por casualidad condepthdentro del loop desj__discard_untilsin haber sido inicializador->depthya está inicializado en cero aquí; ver este código relacionadostdbool.hystddef.hpara definiciones de tipos), no tiene juegos raros de templates de C++ y su API es intuitiva. Una biblioteca en C que cumpla con todos esos requisitos es realmente rara, y en C++ todavía más