C'yi sola yapıştır ve "Convert"'e tıkla — JSON'a çeviririzC kodu yapıştır

Bu araç ne yapıyor

Bir C struct'ını yansıtan bir JSON payload'a ihtiyacın olduysa — gcc ile build edilmiş bir servisin testi için, embedded bir cihazın config'i için ya da ufak bir dökümantasyon için — normalde işin nasıl gittiğini bilirsin: cJSON'ı projeye çek, field başına glue code yaz, rebuild et, debug et. C'yi buraya yapıştır, Makefile'a dokunmadan geçerli JSON al. Tek bir designated initializer, birkaç struct'lı bir header, ya da iç içe tipler ve array'ler olan bir şey olsun — sonuç aynı: her field'i korunmuş temiz bir JSON dokümanı.

Dönüştürücü, C değerlerinin gerçekten nasıl serialize olduğunu anlıyor. int, long, size_t, float ve double hepsi JSON number olur. char array'leri ve string literal'leri JSON string olur. stdbool.h'dan gelen bool, true/false olur. Sabit array'ler (int items[3]) doğru uzunlukta JSON array'e dönüşür. İç içe struct'lar — mesela bir Order içindeki Address — iç içe JSON object'lere açılır. Davranış C dil referansı'nı takip eder.

C99 designated initializer'ları (.field = value) tam desteklidir — günümüzde gerçek dünyada struct literal'lerinin yazıldığı normal yol budur. typedef alias'ları çözülür, enum değerleri bağlama göre ya sayısal değer olarak ya da sembol adı olarak çıkar. union tipler aktif member'ı serialize eder. NULL'a işaret eden pointer'lar JSON null olur; değilse işaret ettiği değer açılır. Birden fazla struct'ı aynı anda yapıştır, her biri çıktıda top-level key olur.

Nasıl kullanılır

Üç adım. İki satırlık bir initializer için de, yirmi typedef'li koca bir header için de aynı.

1

C'yi yapıştır (veya örneği yükle)

C'yi sol editöre olduğu gibi at. Bir struct tanımı, bir typedef, bir designated initializer, birden fazla struct, ya da iç içe array'ler — hepsi iyi. Gerçekçi bir örnek görmek istersen önce Load Sample'a tıkla.

#include direktiflerini ya da derleyiciye özgü attribute'ları çıkarmana gerek yok. ISO C söz dizimini olduğu gibi bırak — parser halleder. Hem C89 hem modern (C11/C17/C23) sorun değil.

2

Convert'e bas

Yeşil Convert butonuna tıkla. Araç C'yi okur, her struct'ı gezer, initializer'ları açar ve JSON'u tek seferde üretir. İşlem sırasında bir yükleme göstergesi görünür.

3

JSON'u kopyala

Sağ panel girintili JSON ile dolar. HTTP istemcine, embedded firmware config'ine, test fixture'ına ya da README'ne kopyala. İşin tamamı bu kadar — build adımı yok.

Ne zaman gerçekten işe yarar

Embedded config ve firmware

C'de bir cihaz config struct'ın var ve bir REST endpoint ya da provisioning aracı için JSON versiyonu gerekiyor. Struct'ı yapıştır, JSON'u al, gönder.

API istek payload'ları

Üçüncü taraf bir API'yi saran bir C servisi. İstek struct'ını yapıştır, prodüksiyonda cJSON'u bağlamadan önce curl ile test edebileceğin JSON'u al.

Unit test fixture'ları

Unit testlerindeki designated initializer'ları integration testler veya golden-file karşılaştırmaları için JSON seed dosyalarına dönüştür.

Kodla eşleşen dökümantasyon

README ya da protokol dökümanı için JSON örneklerini doğrudan gerçek struct'larından üret, böylece dökümantasyon header dosyasıyla sync kalır.

Sık sorulan sorular

cJSON veya Jansson yüklü olması gerekir mi?

Hayır. Bu araç sunucu tarafında çalışır ve kodunu derlemez — bir serialization kütüphanesini projeye çekmeden JSON alırsın. Runtime'da bir seçenek istersen cJSON alışılmış tercihtir; Jansson da iyi bir başka seçenek.

Designated initializer'ları ve typedef'leri anlıyor mu?

Evet. C99 designated initializer'ları (.field = value) tam desteklidir ve typedef alias'ları altındaki struct'a kadar çözülür. İç içe designated initializer'lar, bir derleyicinin yerleştireceği gibi açılır.

Peki ya array'ler, pointer'lar ve NULL?

Sabit boyutlu array'ler doğru eleman sayısıyla JSON array olur. NULL olan pointer member'lar JSON null olur; değilse işaret edilen değer açılır. Struct array'leri de aynı şekilde çalışır — her eleman iç içe bir JSON object'tir.

Enum'lar ve union'lar nasıl işleniyor?

enum değerleri bağlama göre sembol adı ya da sayısal değer olarak çıkar. union tipler o an aktif olan member'ı serialize eder. Bitfield'ler (unsigned flags : 4) sayı olur.

Kodum saklanıyor mu?

Kodun dönüşüm için backend'e gönderilir ve saklanmaz — payload'ı loglamıyoruz. Kod gerçekten hassassa (sırlar içeren embedded firmware, iç protokol detayları), yapıştırmadan önce bir göz gezdir.

Ya C'de macro ya da derleyici eklentileri varsa?

Bir değere açılan macro'lar çalışır; gerçek mantık yapan function-like macro'lar opak sayılır ve çökmek yerine null olarak yayılır. GCC ve MSVC attribute'ları (__attribute__, __declspec) tolere edilir ve görmezden gelinir.

İhtiyacın olabilecek diğer araçlar

C'den JSON'a, bulmacanın sadece bir parçası. Bunlar onunla iyi gider: