Sj.h : une minuscule bibliothèque de parsing JSON écrite en environ 150 lignes de C99
(github.com/rxi)- Sj.h est un parseur JSON ultra-léger d’environ 150 lignes, utilisable dans des environnements basés sur C99
- Il se distingue par des allocations mémoire nulles et un état minimal, ce qui le rend adapté aux environnements embarqués légers ou aux projets qui veulent réduire les dépendances au minimum
- Il adopte une approche de traitement direct pour le parsing des nombres et des chaînes, ce qui permet à l’utilisateur d’implémenter librement le comportement associé
- Il prend en charge des messages d’erreur basés sur ligne:colonne, améliorant la lisibilité et l’identification de l’emplacement lors du debugging
- Logiciel du domaine public, il autorise librement l’utilisation, la modification et la redistribution
Présentation du projet
- Sj.h est un fichier d’en-tête C99 qui fournit des fonctions de parsing JSON avec un minimum de code, sans fonctionnalités excessives ni allocations mémoire inutiles
- L’implémentation complète tient en environ 150 lignes, ce qui le rend adapté aux systèmes embarqués, aux outils, ou aux cas où l’on souhaite réduire la dépendance à des bibliothèques externes
Caractéristiques principales
- Fonctionne avec zero-allocations et un minimal state, donc avec une empreinte mémoire très faible
- Des messages d’erreur incluant les informations ligne:colonne permettent de repérer facilement l’emplacement des problèmes survenant pendant le parsing
- Le parsing des nombres n’est pas fourni par défaut ; l’utilisateur peut employer la méthode de son choix, comme strtod, atoi
- Le parsing des chaînes peut également être implémenté directement, y compris la gestion des Unicode surrogate pairs si nécessaire
- Tout le code source est fourni dans le domaine public (Unlicense), ce qui permet son utilisation et sa modification sans contrainte de licence
Exemple d’utilisation
- Un exemple simple est fourni pour parser une chaîne JSON dans une structure Rect
char *json_text = "{ \"x\": 10, \"y\": 20, \"w\": 30, \"h\": 40 }"; typedef struct { int x, y, w, h; } Rect; ... - Il utilise une API simple et claire comme sj_Reader, sj_Value, sj_reader, sj_read, sj_iter_object
- Le parsing des valeurs numériques ou la comparaison clé-valeur doivent être implémentés directement par l’utilisateur (pas de builtin fourni)
- Le dossier demo permet de consulter divers exemples d’utilisation supplémentaires
Licence
- Sj.h est un logiciel du domaine public que chacun peut utiliser sans restriction
- Voir le fichier LICENSE pour plus de détails
Divers
- Le code et l’arborescence des dossiers sont simples, ce qui permet une utilisation immédiate sans configuration ni procédure de build particulière
- Il est autonome, sans dépendances externes, et convient surtout aux environnements où la légèreté et la facilité d’utilisation sont importantes
1 commentaires
Avis Hacker News
intdu code source par du 64 bits ; cela dit, si l’entrée dépasse2^64, ça finira quand même par casser. Je n’ai pas l’intention d’ajouter partout des vérifications de dépassement d’int.intest sur 32 bits, le problème n’apparaît que s’il faut des imbrications de 2 milliards de niveaux sur une ligne, un fichier de plus de 2 milliards de lignes, ou une ligne de plus de 2 milliards de caractères.]que}pour fermer un objet ou un tableau, et considère\vcomme un whitespace, ce qui la rend plus permissive que le standard. Il vaut mieux la voir comme un « extracteur de données pour du JSON correct ». Mais écrire soi-même les parseurs de strings ou de nombres peut être pénible, surtout quand il faut un accord avec le producteur sur un sous-ensemble de la grammaire JSON.floatou enint, donc il faudrait probablement ajouter soi-même cette partie. Cela dit, c’est impressionnant et j’aurais envie de l’utiliser ; je voulais juste le signaler.= { 0 }a simplement été omis. Dans ce code,r->depthpourrait ne pas être initialisé et finir par devenir accidentellement égal àdepthdans la bouclesj__discard_untilr->depthest déjà initialisé à 0 ici, voir ce code