CSV ve JSON, bir geliştirici olarak karşılaşacağınız muhtemelen en yaygın iki veri formatıdır. CSV dosyaları elektronik tablo dışa aktarmalarında, veritabanı dökümlerinde ve veri bilimi boru hatlarında karşımıza çıkar. JSON ise web'in her yerinde — REST API'leri, yapılandırma dosyaları, NoSQL veritabanları. Her ikisi de düz metin, her ikisi de insan tarafından okunabilir ve her ikisi de işi halleder. Ancak farklı veri şekilleri için inşa edilmişlerdir ve yanlış birini seçmek gerçek baş ağrılarına yol açar. Bu makale temel farklılıkları ele alıyor, her formatın nerede parladığını (ve çöktüğünü) somut örneklerle gösteriyor ve aralarında seçim yapmak için pratik bir karar kılavuzu sunuyor.
Temel Fark: Tablolar ve Ağaçlar
RFC 4180'de tanımlanan CSV — düz, tablo biçiminde bir formattır. Her satırın aynı sütunları vardır, her değer bir dizedir. Bu kadar. Bir elektronik tabloya veya veritabanı tablosuna mükemmel şekilde eşlenir: satırlar aşağı, sütunlar karşıya.
RFC 8259'da belirtilen ve json.org'da açıklanan JSON — hiyerarşik bir formattır. Değerler nesne, dizi, dize, sayı, boolean veya null olabilir. Nesneler nesnelerin içine yuvalanır, diziler farklı şekiller tutar. Verinin kodda gerçekte nasıl yaşadığına eşlenir — ilişkileri olan kayıtlar, farklı şeylerin listeleri, tipli değerler.
Aynı Veri Her İki Formatta
İşte farkın somutlaştığı yer burası. Bir e-ticaret mağazası için bir ürün kataloğu hayal edin. Ürünlerin bir adı, fiyatı ve stokta olup olmadığı var — bu doğrusal. Ama aynı zamanda varyantları (beden, renk) ve özellikleri (malzeme, ağırlık) da var. Bu verinin her iki formatta nasıl göründüğüne bakalım.
JSON'da bu doğal:
[
{
"id": "SHOE-001",
"name": "Trail Runner Pro",
"price": 129.99,
"inStock": true,
"attributes": {
"material": "mesh",
"weightGrams": 280
},
"variants": [
{ "size": 9, "color": "black", "sku": "TR-9-BLK", "qty": 12 },
{ "size": 9, "color": "white", "sku": "TR-9-WHT", "qty": 4 },
{ "size": 10, "color": "black", "sku": "TR-10-BLK", "qty": 7 }
]
},
{
"id": "SHOE-002",
"name": "City Walker",
"price": 89.99,
"inStock": true,
"attributes": {
"material": "leather",
"weightGrams": 340
},
"variants": [
{ "size": 8, "color": "brown", "sku": "CW-8-BRN", "qty": 6 },
{ "size": 9, "color": "brown", "sku": "CW-9-BRN", "qty": 15 }
]
}
]Şimdi bunu CSV'ye koymaya çalışın. Her ikisi de beceriksizce iki seçeneğiniz var. Birinci seçenek: her şeyi düzleştirin ve her varyant satırı için üst veriyi tekrarlayın:
product_id,product_name,price,inStock,material,weightGrams,variant_size,variant_color,sku,qty
SHOE-001,Trail Runner Pro,129.99,true,mesh,280,9,black,TR-9-BLK,12
SHOE-001,Trail Runner Pro,129.99,true,mesh,280,9,white,TR-9-WHT,4
SHOE-001,Trail Runner Pro,129.99,true,mesh,280,10,black,TR-10-BLK,7
SHOE-002,City Walker,89.99,true,leather,340,8,brown,CW-8-BRN,6
SHOE-002,City Walker,89.99,true,leather,340,9,brown,CW-9-BRN,15Ürün adı, fiyatı ve özellikleri her varyant için tekrarlanıyor. Bu veri fazlalığı — beş satır için büyük bir sorun değil ama 8 varyantlı 50.000 ürünlük bir katalog için bu birikir. İkinci seçenek: varyantları bir CSV sütununda JSON dizesi olarak serileştirin — ama artık CSV'nin sınırlamalarını aşmak için CSV içine JSON yerleştiriyorsunuz ki bu gerçekten bir kötü uygulama.
CSV'nin Kazandığı Yerler
Bu sınırlamaya rağmen, CSV birçok yaygın senaryoda gerçekten daha iyi bir seçimdir.
- Elektronik tablolar ve BI araçları. Excel, Google Sheets, Tableau, Looker, Power BI — hepsi CSV'yi tek tıklamayla yerel olarak açar. İçe aktarma sihirbazı yok, tanımlanacak şema yok, dönüşüm adımı yok. Paydaşlarınız elektronik tablolarda yaşıyorsa, CSV en az direnç yoludur.
- Saf düz veri. Veriniz gerçekten bir tabloyu oluşturuyorsa — analitik olayları, işlem günlükleri, sensör okumaları, kullanıcı dışa aktarımı — CSV daha küçük ve daha basittir. Tekrarlanan anahtar yok, parantez yok, gürültü yok.
- Veritabanı içe/dışa aktarma. Her SQL veritabanında bir
COPY FROM CSVveya eşdeğer komutu vardır. Bu, toplu veri yükleme için standart değişim formatıdır ve INSERT ifadelerinden kat kat daha hızlıdır. - pandas ve veri bilimi.
pandas.read_csv()Python veri çalışmalarında en çok kullanılan fonksiyonlardan biridir. Tüm ekosistem — NumPy, scikit-learn, Polars — CSV'yi birinci sınıf giriş formatı olarak ele alır. - Büyük düz tablolar için dosya boyutu. Her satırda anahtar adları olmadan, CSV çok sayıda satırı olan geniş tablolar için daha küçüktür. Bir milyon satırlık analitik olayları CSV'si, eşdeğer JSON dizisini rahatça geçer.
JSON'nun Kazandığı Yerler
- İç içe geçmiş ve hiyerarşik veriler. Verilerinizin düz bir tablonun ötesinde herhangi bir yapısı olduğu anda — iç içe nesneler, farklı şekillerdeki diziler, ilişkili kayıtlar — JSON bunu doğal olarak işler. CSV, bilgi kaybetmeden veya fazlalık oluşturmadan bunu temsil edemez.
- Tip korunumu. CSV'de her şey bir dizedir.
true,42,nullve"true"hepsi aynı görünür. Alıcı tarafta tipleri çıkarsalamak zorundasınız ki bu hatalara yol açar. JSON'un yerel boolean, sayı ve null değerleri vardır.inStock: trueaçıkça bir boolean — tahmin gerekmez. - REST API'leri ve web. JSON, web'in yerel veri formatıdır. Her HTTP istemci kütüphanesi, her tarayıcının Fetch API'si, her REST ve GraphQL API JSON konuşur. HTTP üzerinden CSV göndermek mümkündür ancak alışılmadıktır — her iki tarafta da özel ayrıştırma gerekir.
- NoSQL veritabanları. MongoDB, DynamoDB, Firestore, Elasticsearch, CouchDB — hepsi JSON'u (veya BSON gibi ikili bir üst kümesini) yerel belge formatı olarak kullanır. JSON yazarsınız, JSON geri alırsınız.
- Yapılandırma dosyaları.
package.json,tsconfig.json,manifest.json— araçlar yapılandırması JSON'da standartlaştı çünkü iç içe yapıları destekler, özel alanlar aracılığıyla yorum benzeri ifadelere izin verir ve programatik olarak oluşturmak ve doğrulamak kolaydır. - Şema doğrulama. JSON Şeması, bir belgenin tam şeklini tanımlamanıza ve verileri buna karşı doğrulamanıza olanak tanır — tip kontrolleri, gerekli alanlar, desen eşleştirme, dizi kısıtlamaları. CSV'nin eşdeğer bir standardı yoktur.
Dosya Boyutu: Gerçek Hikaye
"CSV daha küçüktür" iddiası bir özel durumda doğrudur: çok sayıda satıra sahip büyük düz tablolar. Her biri sekiz sabit alana sahip 100.000 analitik olayı alın. CSV'de alan adları başlıkta bir kez görünür. JSON'da her nesnede görünürler. Bu tekrar birikir — JSON dizisi, eşdeğer CSV'den %30–50 daha büyük olabilir.
Ama senaryoyu iç içe verilere çevirin ve matematik değişir. Ayakkabı kataloğumuzun düzleştirilmiş CSV'si ürün adını, fiyatını ve özelliklerini her varyant satırında tekrarlıyor. JSON versiyonu her ürünü bir kez saklar. Birçok tekrarlanan üst alana sahip derinlemesine iç içe veriler için JSON aslında daha küçük olabilir.
Pratikte, dosya boyutu gerçek bir endişeyse, her iki format da gzip ile son derece iyi sıkıştırılır — JSON'daki tekrarlayıcı anahtar adları ve CSV'deki tekrarlanan satır değerleri her ikisi de yoğun biçimde sıkıştırılır. HTTP üzerinden gzip'lenmiş JSON sunmak standart uygulamadır ve boyut farkı genellikle sıkıştırmadan sonra ihmal edilebilir düzeye gelir.
Araç Karşılaştırması
Her format için araç hikayesi, en çok kullanıldığı yeri yansıtır.
CSV araçları: Excel, Google Sheets ve LibreOffice Calc yerel olarak açar.
pandas kütüphanesi
Python'da veri analizi için CSV'yi varsayılan yapar. Her ilişkisel veritabanının bir CSV içe/dışa aktarma
komutu vardır. csvkit ve xsv gibi komut satırı araçları, kod yazmadan CSV dosyalarını
filtrelemenize, birleştirmenize ve toplamanıza olanak tanır. MIME tipi text/csv'dir, IANA'ya kayıtlıdır.
JSON araçları: Her programlama dilinde yerleşik veya standart kütüphane JSON ayrıştırıcısı vardır.
JavaScript'te JSON.parse(), Python'da json.loads(), Go'da encoding/json,
Rust'ta serde_json. MDN JSON referansı
MDN'deki en çok ziyaret edilen sayfalardan biridir. Komut satırında: jq, JSON sorgulamak ve
dönüştürmek için vazgeçilmezdir. IDE'ler otomatik olarak güzel yazdırır ve doğrular.
Her iki dünyaya da yayılan veri boru hatlarıyla çalışıyorsanız — JSON API yanıtlarını bir veri ambarına yüklemek veya veritabanı kayıtlarını bir elektronik tablo için dışa aktarmak — ikisi arasında düzenli olarak dönüşüm yapacaksınız. CSV'den JSON'a dönüştürücü ve JSON'dan CSV'ye dönüştürücü bunu hızla halleder. İşlemeden önce ham dosyaları düzenlemek için CSV Biçimleyici ve JSON Biçimleyici yer imlerine almaya değer.
Hibrit: JSON Lines (NDJSON)
Bilmeye değer üçüncü bir seçenek var: JSON Lines, aynı zamanda NDJSON (Newline-Delimited JSON / Yeni Satırla Ayrılmış JSON) olarak da bilinir. Fikir basit — satır başına bir tam JSON nesnesi, çevreleyen dizi yok.
{"id":"SHOE-001","name":"Trail Runner Pro","price":129.99,"inStock":true,"variantCount":3}
{"id":"SHOE-002","name":"City Walker","price":89.99,"inStock":true,"variantCount":2}
{"id":"SHOE-003","name":"Summit Hiker","price":159.99,"inStock":false,"variantCount":5}Bu format, belirli kullanım durumları için her iki dünyanın en iyisini almanızı sağlar. CSV gibi,
tüm dosyayı belleğe yüklemeden satır satır akış ve işleme yapabilirsiniz — büyük
günlük dosyaları veya veri boru hattı çıktıları için kritik. JSON gibi, her satır farklı bir şemaya sahip olabilir ve
tipleri korur. Standart Unix araçlarını (grep, wc -l, head)
kullanabilirsiniz, ama her satırı yapılandırılmış sorgulama için jq'ya da iletebilirsiniz.
NDJSON, günlük toplama (birçok yapılandırılmış günlükçü için varsayılan çıktı formatıdır), veri boru hattı aşamaları ve ML eğitim verisi dışa aktarmalarında yaygın olarak kullanılır. Milyonlarca kaydı işleyen ve her kaydın bir JSON nesnesi olduğu bir betik yazıyorsanız, NDJSON genellikle devasa bir JSON dizisine kıyasla doğru seçimdir — tüm şeyi belleğe yüklemekten kaçınırsınız ve bir kontrol noktasından kolayca devam edebilirsiniz.
import json
# Process a large NDJSON file without loading it all into memory
with open('products.ndjson', 'r') as f:
for line in f:
product = json.loads(line.strip())
if product['inStock'] and product['price'] < 100:
print(f"{product['name']} — ${product['price']}")Karar Kılavuzu: CSV vs JSON
İşte pratik versiyon. İkisi arasında seçim yaparken kendinize bu soruları sorun:
- Veriniz gerçekten düz mı (iç içe geçme yok, dizi yok)? Eğer evetse, CSV daha basittir. Hayır ise, JSON.
- Bu dosyayı geliştirici olmayan biri tüketecek mi? Excel'deki analistler? Google Sheets'teki iş kullanıcıları? CSV kullanın.
- Bir HTTP API'si sunuyor veya tüketiyor musunuz? JSON kullanın. Nokta.
- Toplu veritabanı içe veya dışa aktarma yapıyor musunuz? CSV kullanın — her veritabanı yerel olarak destekler.
- Veride karışık tipler var mı (boolean, sayılar, null)? Alıcı tarafta tip çıkarsama hatalarını önlemek için JSON kullanın.
- Dosya bir akış boru hattında satır satır işlenecek mi? Orta yol olarak NDJSON'u düşünün.
- Yapılandırma mı saklıyorsunuz? JSON kullanın (ya da yorumlar sizin için önemliyse YAML).
- Şemanın kayıt başına değişmesi gerekiyor mu? JSON. CSV her satırda aynı sütunları zorlar.
Sonuç
CSV ve JSON gerçekte rekabet etmiyor — farklı sorunları çözüyorlar. CSV, veriniz bir tablo olduğunda ve elektronik tablo ve veritabanı araçlarıyla maksimum uyumluluk istediğinizde doğru araçtır. JSON, verinizin yapısı, tipleri veya iç içe geçmişliği olduğunda ve API'lerle veya uygulamalarla konuştuğunuzda doğru araçtır.
Karar, verinin gerçek şekline baktığınızda genellikle zor olmaz. Sensör okumalarının düz satırları? CSV. İç içe kullanıcı profilleri ve gömülü sipariş geçmişleri içeren bir API yanıtı? JSON. Yapılandırılmış olayların akış günlüğü? NDJSON. Formatı verinin şekliyle ve her iki uçtaki araçlarla eşleştirin, nadiren yanılırsınız.