Guide
CSV'den JSON'a: Veri Ne Zaman Bozulur
Dönüşümün kendisi önemsizdir. Bozulma, dönüştürücülerin sessizce yanıtladığı iki soruda gerçekleşir: bu alan nerede bitiyor ve bu değer hangi tür?
By Buğra SözeriPublished
CSV'yi JSON'a dönüştürmek, veri boru hattındaki en kolay iş gibi görünür: satırlar girer, nesneler çıkar. Aynı zamanda tek bir hata mesajı vermeden bir veri kümesini bozmanın en güvenilir yollarından biridir. Bozulma hiçbir zaman dönüşüm adımının kendisinden gelmez — genellikle sessizce yanıtlanması gereken iki sorudan gelir: bu alan nerede bitiyor ve bu değer hangi tür.
CSV basit görünür. Değildir.
JSON'un gerçek bir grameri vardır (ECMA-404). CSV'nin RFC 4180'i vardır, ki bu bir standarttan çok yaygın davranışın bir açıklamasıdır — ve gerçek dünyadaki birçok dosya bunu bile yok sayar. Saf kodun yanlış yaptığı RFC kuralları:
- Alanlar tırnaklanabilir ve tırnaklı bir alan virgül içerebilir, dolayısıyla
"Smith, John"tek bir alandır. Herhangi bir alan tırnaklandığı anda bir satırı virgüllere göre bölmek yanlıştır. - Tırnaklar ikilenerek kaçışlanır:
"5'10""",5'10"'u kodlar. Birçok elle yazılmış ayrıştırıcının varsaydığı ters eğik çizgi kaçışı RFC 4180 değildir. - Tırnaklı alanlar satır sonları içerebilir. Çok satırlı bir adres geçerli bir CSV'dir; bu da bir CSV dosyasını satır satır bile okuyamayacağınız anlamına gelir. Doğru bir ayrıştırıcının durum tutması gerekmesinin tek nedeni bu kuraldır.
Sonra gerçeklik, RFC'nin kapsamadıklarını ekler: noktalı virgül veya sekmeyle "ayrılmış" dosyalar (virgülün ondalık ayırıcı olduğu Avrupa yerel ayarları), ilk başlık adına sessizce üç görünmez bayt yapıştıran bir UTF-8 bayt sırası işareti (böylece kodunuz id'yi arar ama anahtar aslında id'dir) ve Windows-1252 gibi UTF-8 olarak okunduğunda her aksanlı adı bozuk karaktere çeviren eski kodlamalar. Sınırlayıcıyı algılamayan, BOM'u kaldırmayan ve kodlamayı doğru yapmayan bir dönüştürücü, tür işleme daha başlamadan dosyayı bozar.
Başlık algılama
RFC 4180, başlık satırını isteğe bağlı yapar ve dosyada hiçbir şey onun mevcut olup olmadığını söylemez. Bir yönde yanlış tahmin ederseniz ilk veri kaydınız diğer her şey için anahtar adları olur; diğer yönde yanlış tahmin ederseniz field1 gibi anahtarlar elde edersiniz. İyi dönüştürücüler bir sezgisel yöntem kullanır — tümü sayısal olmayan, tekrarlanmayan stringlerden oluşan bir ilk satır muhtemelen bir başlıktır — ancak sezgisel yöntemler tamamen metin verilerde başarısız olur, bu yüzden kullanmaya değer herhangi bir dönüştürücü tahmini geçersiz kılmanıza izin verir. Yinelenen başlık adlarına da dikkat edin: JSON nesne anahtarları benzersiz olmalıdır, dolayısıyla iki amount sütunu, birinin sessizce kazandığı veya yeniden adlandırıldığı anlamına gelir.
Tür sorunu: her şey bir string
CSV'nin türü yoktur. 42, TRUE ve 2024-01-05, hepsi sadece karakter dizileridir ve dönüştürücünün bunların JSON'da ne olacağına karar vermesi gerekir. Her seçim bir şey kaybeder:
- Baştaki sıfırlar.
02134'ü sayı olarak çıkarın, posta kodu2134olur. Telefon numaraları, ürün kodları ve banka sıralama kodları için de aynısı geçerlidir: sayısal görünen tanımlayıcılar sayı değildir. - Büyük tam sayılar. JSON'un grameri her büyüklükte sayıya izin verir, ancak JavaScript (ve çoğu JSON ayrıştırıcısı) bunları yalnızca 253 − 1'e kadar kesin olan IEEE 754 double olarak saklar. 19 haneli bir veritabanı kimliği veya kredi kartı uzunluğunda bir sayı, sessizce yakın bir değere yuvarlanır. Kimlikler string olarak kalmalıdır.
- Boolean'lar.
TRUE, JSON değeritruemudur yoksa kullanıcının yazdığı string mi? YaYes,Y,1? Doğru bir yanıt yoktur, yalnızca belgelenmiş bir yanıt vardır. - Tarihler. JSON'da tarih türü hiç yoktur ve
03/04/2024, yerel ayara bağlı olarak 4 Mart veya 3 Nisan'dır. Tarihleri string olarak tutmak tek güvenli varsayılandır. - Boş alanlar. CSV,
null'u boş bir stringden ve eksik bir değerden ayırt edemez; JSON üçünü de birbirinden ayırt eder.
Excel burada kendi başına bir uyarıyı hak ediyor, çünkü CSV bozulmasının çoğu herhangi bir dönüştürücü dosyayı görmeden önce gerçekleşir. Excel açılışta agresif tür çıkarımı uygular: baştaki sıfırlar silinir, 15 haneden uzun tam sayılar yuvarlanır ve tarih benzeri stringler dönüştürülür — genler resmi olarak 2020'de yeniden adlandırılana kadar binlerce yayınlanmış genetik makalesinde tarih olarak görünen MARCH1 ve SEPT2 gibi insan gen adları da buna dahildir. Bir CSV daha önce Excel'de açılıp kaydedildiyse, içindeki sayısal görünen her tanımlayıcıyı şüpheli sayın.
Tutucu kural: dönüştürücünün açık ölçümler için türleri çıkarmasına izin verin, ancak tanımlayıcı işlevi gören her şeyi — posta kodları, kimlikler, hesap numaraları — string olarak tutun ve çıktıya güvenmeden önce noktasal kontrol yapın.
Düz satırlar ve iç içe JSON
Bir CSV satırı düzdür; bir JSON nesnesi düz olmak zorunda değildir. Hedef şekil iç içe olduğunda, iç içe geçme sütun adlarında kodlanmalıdır ve fiili kural yol başlıklarıdır: user.address.city (nokta gösterimi) veya user[address][city] (köşeli parantez gösterimi) adlı bir sütun iç içe nesnelere, items[0].sku, items[1].sku ise bir nesne dizisine genişler. Birçok dönüştürücü ve kütüphane bu genişlemeyi destekler; hiçbiri standartlaştırılmamıştır, bu yüzden bir sütun adının gerçekten parçası olan noktalar (düz bir anahtar olarak price.usd), araç genişletmeyi kapatmanıza izin vermedikçe yanlış genişletilir. Bir kural seçin, her iki yönde de uygulayın ve yazıya dökün.
Geri dönüş: JSON'dan CSV'ye daha fazla kaybeder
Ters dönüşüm daha kayıplıdır. Düz nesnelerin tekdüze bir dizisi bir tabloya temiz biçimde eşlenir; başka her şey kararlar dayatır. İç içe nesneler yol sütunlarına düzleştirilir. Diziler daha kötüdür: üç kalem içeren bir sipariş ya üç satıra patlar (sipariş alanlarını çoğaltıp satır sayısını değiştirir) ya da bir CSV hücresi içinde bir JSON stringi olarak serileştirilir — teknik olarak geçerli, pratikte bir elektronik tabloda okunaksız. Farklı anahtarlara sahip kayıtlar, null, boş string ve "anahtar yok"un hepsinin aynı boş hücreye çöktüğü geniş, seyrek bir tabloda birleşir. Verileriniz CSV→JSON→CSV döngüsünden bayt bazında aynı çıkarsa, gerçekten tablo biçimindeydi; çıkmazsa, fark size CSV'nin taşıyamadığı yapıyı tam olarak gösterir. Geri dönüştürmeden önce ara JSON'u bir biçimlendiricide incelemek bu kayıpları sessiz olmaktan çıkarıp görünür kılar.
JSONL, JSON dizisini ne zaman geçer
Geleneksel bir dönüşüm, her satır-nesnesini tek bir büyük JSON dizisine sarar — bu da bir tüketicinin ilk kayda dokunmadan önce tüm dosyayı ayrıştırması gerektiği, bir üreticinin ise kapanış parantezini yazmak için hepsini tutması gerektiği anlamına gelir. JSON Lines (JSONL/NDJSON) diziyi bırakır: satır başına tam bir JSON nesnesi, yeni satırla ayrılmış. Her satır bağımsız olarak ayrıştırılır, bu yüzden format JSON'un türlerini ve iç içe geçmesini korurken CSV gibi akar, eklenir, bölünür ve grep'lenir. BigQuery ve Elasticsearch gibi araçların yerel toplu formatıdır ve satır sayısı büyük veya sınırsız olduğunda doğru hedeftir. Pratik kural: bir API'nin bütün döndürdüğü yapılandırma boyutunda bir yük için JSON dizisi; veri kümeleri için JSONL.
Boyut ve akış
JSON her anahtar adını her kayıtta tekrarlar, dolayısıyla dönüştürülmüş çıktı tipik olarak kaynak CSV'nin iki ila dört katı boyutunda olur — çok gigabaytlık bir dışa aktarımı dönüştürmeden önce hatırlamaya değer. Tersine, CSV'nin tırnaklı-satır-sonu kuralı, doğru akışın hâlâ bir satır bölücü değil, durum tutan bir ayrıştırıcı gerektirdiği anlamına gelir. Onlarca megabayta kadar olan dosyalar için tarayıcı içi bir dönüştürücü tüm işi yerel olarak halleder; bunun ötesinde, bir kütüphaneyle akış yapın (Python'un csv modülü, PapaParse ve eşdeğerleri hepsi artımlı olarak ayrıştırır) ve hiçbir tarafın veri kümesini bellekte tutmasına gerek kalmaması için JSONL üretin. Veri bir boru hattı yerine bir yapılandırma dosyasına gidiyorsa, JSON zaten son durak olmayabilir — yapılandırma için JSON ve YAML karşılaştırmamıza bakın.
Kısa özet: CSV'yi gerçek bir ayrıştırıcıyla ayrıştırın, asla virgül bölmesiyle değil; BOM'u kaldırın ve sınırlayıcı ile kodlamayı doğrulayın; tanımlayıcıları ne kadar sayısal görünürse görünsün string olarak ele alın; veri dosyalarını asla Excel üzerinden döndürmeyin; iç içe geçmeyi tek, belgelenmiş bir yol kuralıyla kodlayın; ve veri belleğe rahat sığmamaya başladığı anda JSONL'ye yönelin.
Frequently asked questions
- CSV'yi JSON'a nasıl dönüştürürüm?
- CSV'yi gerçek bir RFC 4180 ayrıştırıcısıyla ayrıştırın (asla virgüllere göre saf bir bölme yapmayın), ilk satırı alan adları olarak ele alın ve veri satırı başına, bu adları anahtar olarak kullanan bir JSON nesnesi üretin. İstemci taraflı bir dönüştürücü bunu dosyayı yüklemeden tarayıcıda yapar; kod için, tırnaklama kurallarını elle yazmak yerine dilinizdeki köklü bir CSV kütüphanesi kullanın. Bilinçli olarak verilmesi gereken iki karar başlık işleme ve türlerin çıkarılıp çıkarılmayacağı ya da her şeyin string olarak tutulup tutulmayacağıdır.
- Bir CSV satırını virgüllere göre bölmek neden bozuluyor?
- Çünkü RFC 4180 alanların tırnaklanmasına izin verir ve tırnaklı bir alan virgül, çift tırnak (ikilenerek kaçışlanır) ve hatta satır sonları içerebilir. "Smith, John" gibi bir değer iki değil bir alandır ve tırnaklı bir adres birden fazla satıra yasal olarak yayılabilir. Virgüllere göre bölmek — ya da satır satır okumak — bunların hepsini yanlış ayrıştırır. Doğru herhangi bir dönüştürücü, tırnak içinde olup olmadığını izleyen durum tutan bir ayrıştırıcı kullanır.
- Excel neden CSV değerlerimi değiştiriyor?
- Excel açılışta tür çıkarımı uygular: sayı gibi görünen her şeyden baştaki sıfırları siler (posta kodları, telefon numaraları, ürün kodları), 15 haneden uzun tam sayıları kayan noktalı hücrelerine sığdırmak için yuvarlar ve tarih benzeri stringleri yeniden yorumlar — MARCH1 ve SEPT2 gibi insan gen adlarının, genler 2020'de yeniden adlandırılana kadar binlerce yayınlanmış genetik makalesinde tarih olarak görünmesinin nedeni budur. Hasar açılışta oluşur ve yeniden dışa aktarırsanız geri kaydedilir. CSV'yi Excel'in veri içe aktarma diyaloğu üzerinden sütunları Metin olarak ayarlayarak içe aktarın veya veri dosyalarını Excel üzerinden hiç döndürmeyin.
- İç içe nesnelerle CSV'yi JSON'a nasıl dönüştürürüm?
- CSV düzdür, dolayısıyla iç içe geçme sütun adlarında kodlanmalıdır. Yaygın kural nokta veya köşeli parantez yollarıdır: user.name ve user.address.city (veya user[address][city]) adlı sütunlar iç içe nesnelere, items[0], items[1] ise dizilere genişler. 'Başlık yolu genişletmeyi' destekleyen dönüştürücüler ve kütüphaneler bunu otomatik olarak uygular; bu olmadan, satır başına düz bir nesne elde edersiniz ve sonrasında kodda yeniden yapılandırmanız gerekir. Bir standart yoktur — bir kural seçin ve her iki yönde de tutarlı biçimde kullanın.
- CSV yerine ne zaman JSON kullanmalıyım — ve tersi?
- Veri gerçekten tablo biçimindeyse (her satırda aynı sütunlar, skaler değerler), elektronik tablolarda açılması gerekiyorsa veya JSON'un tekrarlanan anahtar adlarının zarar vereceği kadar büyükse CSV kullanın. Kayıtlar iç içe geçtiğinde, alanlar kayıtlar arasında değiştiğinde veya türler önemli olduğunda JSON kullanın — CSV'nin türü yoktur, dolayısıyla sayılar, boolean'lar ve null'lar yalnızca JSON'da hayatta kalır. Büyük kayıt akışları için, JSON Lines (satır başına bir nesne) JSON'un türlerini CSV'nin satır satır işlemesiyle birleştirir.
- JSON'u CSV'ye dönüştürürken hangi veri kaybolur?
- Düz bir skaler tablosu olmayan her şey. İç içe nesneler yol adlı sütunlara düzleştirilmelidir; nesne dizileri ya birden çok satıra patlar (sipariş alanlarını çoğaltıp satır sayısını değiştirir) ya da string olarak serileştirilir; null, boş string ve eksik anahtar arasındaki ayrım kaybolur, çünkü CSV üçünü de boş bir alan olarak temsil eder; ve her tür ek açıklaması kaybolur, çünkü CSV değerleri sadece metindir. JSON, düz nesnelerin tekdüze bir dizisiyse, dönüşüm kayıpsızdır — aksi halde düzleştirme kararları vermeyi (ve belgelemeyi) bekleyin.
Sources & references
Authoritative references cited by this piece. Verified by Buğra Sözeri on the dates shown and re-checked at every deploy.
- RFC 4180 — Common Format and MIME Type for CSV Files — CSV'nin bir standarda en yakın hali: tırnaklama, gömülü virgüller ve satır sonları, isteğe bağlı başlık satırı(as of )
- ECMA-404 — The JSON Data Interchange Syntax — Hassasiyet sınırı olmayan sayı sözdizimi dahil JSON grameri — hassasiyet sınırları uygulamalardan gelir(as of )
- MDN — JSON.parse() and number precision — JavaScript'in JSON sayılarını IEEE 754 double olarak ayrıştırdığını, 2^53'ün ötesinde tam sayı hassasiyetini kaybettiğini belgeler(as of )
- JSON Lines specification — Tek bir JSON dizisine akış dostu alternatif olarak ele alınan satır başına bir JSON değeri formatı(as of )
Related
Published September 25, 2026