Sj.h: Yaklaşık 150 satırlık C99 ile yazılmış çok küçük bir JSON ayrıştırma kütüphanesi
(github.com/rxi)- Sj.h, yaklaşık 150 satırdan oluşan ultra hafif bir JSON ayrıştırıcısıdır ve C99 tabanlı ortamlarda kullanılabilir
- Sıfır bellek tahsisi ve asgari durum tutma gibi özelliklere sahiptir; hafif gömülü ortamlarda veya bağımlılıkların en aza indirilmesinde avantaj sağlar
- Sayı ve string ayrıştırma için doğrudan işleme yaklaşımını benimser; böylece kullanıcı ilgili işlemleri dilediği gibi gerçekleştirebilir
- Satır:sütun tabanlı hata mesajları desteği sayesinde debugging sırasında okunabilirlik ve konum tespiti yüksektir
- Public domain yazılım olarak, herkesin özgürce kullanmasına, değiştirmesine ve dağıtmasına izin verilir
Proje tanıtımı
- Sj.h, aşırı özellikler veya gereksiz bellek tahsisi olmadan, yalnızca asgari düzeyde kodla JSON ayrıştırma işlevi sunan bir C99 header dosyasıdır
- Tüm uygulama yaklaşık 150 satırdır; gömülü sistemler, araçlar veya harici kütüphane bağımlılıklarını azaltmak isteyen durumlar için uygundur
Başlıca özellikler
- Sıfır bellek tahsisi (zero-allocations) ve asgari durum (minimal state) ile çalıştığı için bellek yükü çok düşüktür
- Satır:sütun bilgisi içeren hata mesajları, ayrıştırma sırasında oluşan sorunların yerini kolayca belirlemeyi sağlar
- Sayı ayrıştırma varsayılan olarak sunulmaz; kullanıcı strtod, atoi gibi istediği yöntemi kullanabilir
- String ayrıştırma da doğrudan uygulanabilir; Unicode surrogate pair işleme gibi ihtiyaçlar isteğe göre eklenebilir
- Tüm kaynak kodu public domain (Unlicense) olarak sunulur; bu sayede lisans kısıtları olmadan kullanılabilir ve değiştirilebilir
Kullanım örneği
- JSON string’ini bir Rect yapısına ayrıştıran basit bir örnek sunuluyor
char *json_text = "{ \"x\": 10, \"y\": 20, \"w\": 30, \"h\": 40 }"; typedef struct { int x, y, w, h; } Rect; ... - sj_Reader, sj_Value, sj_reader, sj_read, sj_iter_object gibi sade ve anlaşılır API’ler kullanır
- Sayısal değer ayrıştırma veya anahtar-değer karşılaştırması kullanıcı tarafından doğrudan uygulanır (yerleşik olarak sunulmaz)
demoklasöründe çeşitli ek kullanım örnekleri bulunabilir
Lisans
- Sj.h, herkesin hiçbir kısıtlama olmadan kullanabileceği bir public domain yazılımıdır
- Ayrıntılar için LICENSE dosyasına bakılabilir
Diğer
- Kod ve klasör yapısı basittir; ayrı bir yapılandırma veya build süreci olmadan doğrudan kullanılabilir
- Bağımsızdır, dış bağımlılığı yoktur ve özellikle hafiflik ile kullanım kolaylığının önemli olduğu ortamlar için uygundur
1 yorum
Hacker News görüşleri
intleri 64 bite çevirirdim. Yine de girdi 2^64'ü aşarsa eninde sonunda patlar. Koddainttaşmalarını tek tek kontrol etmeyi düşünmüyorumint32 bit olduğu için ancak satır başına 2 milyar derinlikte iç içe yapı, 2 milyardan fazla satırlı dosya ya da 2 milyardan uzun tek satır olduğunda sorun çıkıyor]veya}ile kapatmayı da kabul ediyor,\vkarakterini de whitespace sayıyor, yani standarttan daha gevşek. Bunu daha çok "geçerli JSON için veri çıkarıcı" gibi görmek gerek. Ama string ya da number parser'ını da kendiniz yazmanız uğraştırıcı olabilir, özellikle üretici tarafla JSON gramerinin alt kümesi konusunda anlaşmanız gerekiyorsa= { 0 }kısmının mı eksik olduğunu merak ediyorum. İlgili kod'a bakıncar->depthbaşlatılmadansj__discard_untildöngüsünde tesadüfendepthile eşit hale gelebilir gibi duruyorr->depthburada zaten 0 olarak başlatılıyor, bkz. ilgili kodstdbool.hvestddef.hsadece type tanımları için dahil ediliyor), C++ template numaraları yok ve API sezgisel. Tüm bu koşulları aynı anda sağlayan C kütüphaneleri gerçekten çok az; C++ tarafında daha da az