Sj.h: uma biblioteca minúscula de parsing de JSON escrita em cerca de 150 linhas de C99
(github.com/rxi)- Sj.h é um parser JSON ultraleve com cerca de 150 linhas, utilizável em ambientes baseados em C99
- Tem características como alocação zero de memória e estado mínimo, sendo útil para ambientes embarcados leves ou quando se deseja minimizar dependências
- Adota uma abordagem de tratamento direto para o parsing de números e strings, permitindo que o usuário implemente livremente o processamento relacionado
- Oferece suporte a mensagens de erro baseadas em linha:coluna, aumentando a legibilidade e a identificação da posição durante o debug
- Como software em domínio público, qualquer pessoa pode usar livremente, modificar e distribuir
Introdução ao projeto
- Sj.h é um arquivo de cabeçalho C99 que fornece parsing de JSON com apenas o mínimo de código, sem recursos excessivos nem alocações de memória desnecessárias
- A implementação inteira tem cerca de 150 linhas, sendo adequada para sistemas embarcados, ferramentas ou casos em que se deseja reduzir a dependência de bibliotecas externas
Principais características
- Funciona com zero-allocations e minimal state, resultando em consumo de memória muito baixo
- As mensagens de erro incluem informações de linha:coluna, facilitando identificar a posição de problemas que ocorram durante o parsing
- O parsing de números não é fornecido por padrão; o usuário pode usar a abordagem que preferir, como strtod ou atoi
- O parsing de strings também pode ser implementado diretamente, incluindo tratamento de Unicode surrogate pairs conforme necessário
- Todo o código-fonte é fornecido em domínio público (Unlicense), permitindo uso e modificação sem restrições de licença
Exemplo de uso
- É fornecido um exemplo simples de parsing de uma string JSON para uma estrutura Rect
char *json_text = "{ \"x\": 10, \"y\": 20, \"w\": 30, \"h\": 40 }"; typedef struct { int x, y, w, h; } Rect; ... - Usa uma API simples e direta como sj_Reader, sj_Value, sj_reader, sj_read e sj_iter_object
- O parsing de valores numéricos e a comparação de chave-valor devem ser implementados diretamente pelo usuário (não há builtin)
- É possível conferir vários exemplos adicionais de uso na pasta demo
Licença
- Sj.h é um software em domínio público que qualquer pessoa pode usar sem restrições
- Para mais detalhes, consulte o arquivo LICENSE
Outros
- O código e a estrutura de pastas são simples, permitindo uso imediato sem configuração separada ou processo de build
- É independente, não tem dependências externas e é adequado principalmente para ambientes que exigem leveza e facilidade de uso
1 comentários
Comentários no Hacker News
.ini), json.lua (biblioteca leve de JSON para Lua), lite (editor de texto leve feito em Lua), cmixer (mixer de áudio portátil para jogos) e uuid4 (pequena biblioteca uuid4 em C)log.cem praticamente todo projeto em C; não sabia que o autor tinha feito tantas bibliotecas.log.cé realmente muito fácil de usar, então posso recomendar.intdo código-fonte para 64 bits; ainda assim, se a entrada passasse de2^64, no fim morreria do mesmo jeito. Não pretendo sair verificando overflow deintem cada parte do código.inté de 32 bits, só haveria problema se cada linha tivesse aninhamento de 2 bilhões de níveis, se o arquivo tivesse mais de 2 bilhões de linhas, ou se uma única linha tivesse mais de 2 bilhões de caracteres.string-slice.]quanto}para fechar objetos ou arrays, e também reconhece\vcomo whitespace, então é mais permissiva do que o padrão. O mais correto seria vê-la como um "extrator de dados para JSON válido". Ainda assim, pode ser chato escrever por conta própria parsers de string ou número, especialmente quando é preciso alinhar com o produtor sobre um subconjunto da gramática JSON.floatouint, então você provavelmente teria de adicionar essa parte por conta própria. Ainda assim, fiquei impressionado e usaria; estou só apontando isso.= { 0 }. Olhando este código relacionado, parece quer->depthpoderia acabar coincidindo por acaso comdepthno loopsj__discard_untilsem ter sido inicializado.r->depthjá é inicializado com zero aqui: código relacionadostdlib(inclui sóstdbool.hestddef.hpara definir tipos), não tem maluquice de template em C++, e a API é intuitiva. Bibliotecas C que atendam a todos esses requisitos são realmente raras; em C++, mais raras ainda.