- JSON, nesnelerin ve dizilerin sözlükler ve listeler olarak temsil edildiği Python'ın temel veri türlerine sorunsuz bir şekilde eşlenir ve bu da veri alışverişini kolaylaştırır.
- Python'ın json modülü, güzel yazdırma, özel kodlayıcılar ve istikrarlı anahtar sıralaması seçenekleriyle esnek döküm/yükleme işlevleri sağlar.
- Dosyalardan ve API'lerden iç içe geçmiş JSON verilerini okuma, yazma ve ayrıştırma işlemleri, dikkatli hata yönetimiyle birleştirilmiş aynı temel araçlara dayanır.
- Python'da JSON, temel serileştirmenin ötesinde, biçimlendirme, doğrulama ve CSV ve XML gibi diğer veri formatlarıyla entegrasyonu destekler.

JSON, sessizce web'deki veriler için varsayılan dil haline geldi. Python yazıyorsanız, her yerde karşınıza çıkar: API'ler, yapılandırma dosyaları, yan projeler için küçük "veritabanları", loglar ve hatta test ortamları. Python'ın veri tiplerinin JSON'a nasıl eşlendiğini ve bunun nasıl işlediğini anlamak önemlidir. json "Modül gerçekten işe yarıyor" yeteneği, günlük işlerin çoğunu birdenbire kolaylaştıran becerilerden biridir.
Bu kılavuz, bir Python programcısının bakış açısından JSON'u adım adım ele almaktadır. JSON'un ne olduğunu, JavaScript ile ilişkisini, hangi Python türlerini temsil edebildiğini ve JSON'u nasıl ayrıştıracağınızı, oluşturacağınızı, biçimlendireceğinizi, doğrulayacağınızı ve özelleştireceğinizi açıklayan bir metin. jsonAyrıca dosyalar ve API'lerle çalışma gibi gerçek dünya kullanım örneklerine, iç içe geçmiş verileri ve hatalar veya özel değerler gibi uç durumları ele alma yöntemlerine de bakacağız. NaN ve sonsuzluklar.
JSON Nedir ve Python Verileriyle İlişkisi Nedir?
JSON, yani JavaScript Object Notation'ın kısaltması, yapılandırılmış veriler için kullanılan bir metin formatıdır. JSON, sözdizimini başlangıçta JavaScript nesnelerinden ve dizilerinden ödünç almıştır. JavaScript kökenlerine rağmen, JSON dilden bağımsızdır ve Python da dahil olmak üzere neredeyse tüm modern diller tarafından desteklenmektedir; bu da onu hizmetler, istemciler ve sunucular arasında veri alışverişi için ideal hale getirmektedir.
Kavramsal olarak, JSON yalnızca iki temel yapı taşı kullanır: JavaScript nesne ve JavaScript diziBir nesne, Python sözlüğüne çok benzer şekilde davranır ve bir dizi de Python listesine benzer şekilde davranır. Bu ikisi ve küçük bir temel veri türü kümesiyle JSON, karmaşık iç içe geçmiş veri yapılarını tanımlayabilir.
JavaScript'te (ve JSON'da) bir nesne şöyle görünür: {"key1": value1, "key2": value2}Bu, anahtar-değer çiftlerinden oluşan bir koleksiyondur; burada anahtarlar dizelerdir ve değerler herhangi bir geçerli JSON değeri (diğer nesneler veya diziler dahil) olabilir. Bu, Python'daki bir yapıya oldukça benzer. dict.
JavaScript'te (ve JSON'da) bir dizi, Python'daki bir listeye benzer: Bu, geçerli herhangi bir JSON türünü kullanan, sıralı bir değerler koleksiyonudur. Nesneler ve diziler birlikte, kullanıcı profilleri, yapılandırma ağaçları veya API yanıtları gibi zengin verileri modellemek için keyfi olarak iç içe yerleştirilebilir.
JSON türleri ile Python türleri arasındaki eşleştirme oldukça basittir. Bu yüzden bazen insanların şaka yollu "PYON" (Python Nesne Gösterimi) dediğini duyarsınız. Python, JSON'u kodlarken veya kod çözerken aşağıdaki karşılıklar geçerlidir:
- JSON nesnesi → Python
dict - JSON dizisi → Python
list - JSON dizesi → Python
str - JSON sayısı (tamsayı) → Python
int - JSON sayısı (gerçek) → Python
float - JSON
true→ PythonTrue - JSON
false→ PythonFalse - JSON
null→ PythonNone
Önemli bir sınırlama, JSON nesne anahtarlarının her zaman dizeler olmasıdır. Yani eğer bir Python kodunu yazarsanız dict Dize olmayan anahtarlar (örneğin, tamsayılar veya demetler) kullanıldığında, bu anahtarlar ayarlarınıza bağlı olarak dizelere dönüştürülür veya hatalar oluşur. JSON, yapılandırmalar veya kayıtlar gibi yapılandırılmış verileri kalıcı hale getirmek için harikadır, ancak değil Rastgele Python nesneleri için genel bir serileştirme mekanizması.

Python'ın Dahili json Modülü
Python, standart bir kütüphane modülüyle birlikte gelir. json, Bu, JSON ile çalışmak için ihtiyacınız olan her şeyi size sunar: dizeleri ayrıştırma, dosyalardan yükleme, Python nesnelerini serileştirme ve verilerin nasıl kodlanıp çözüleceğini özelleştirme. Tipik JSON görevleri için herhangi bir harici bağımlılığa ihtiyacınız yoktur.
En sık kullanacağınız dört temel işlev şunlardır: json.dumps() hem de json.dump() Python nesnelerini JSON'a dönüştürmek için ve json.loads() hem de json.load() JSON'dan Python türlerine geri dönmek için kullanılır. "s" ile başlayan sürümler dizelerle, "s" içermeyen sürümler ise dosya benzeri nesnelerle çalışır.
MKS json Kodlayıcı varsayılan olarak belirli bir Python türü kümesini destekler. yani dict, list, tuple (diziler olarak), str, sayılar (int, floatve tamsayı/ondalık sayı türetilmiş numaralandırmalar) ve üç özel tekil nesne True, False, ve NoneBunlar, daha önce açıklanan eşlemeye göre JSON karşılıklarına dönüştürülür.
Özel nesneleri veya veri türlerini serileştirmeniz gerekiyorsa, Modülün tasarımı genişletilebilir: JSON kodlayıcıyı alt sınıflara ayırabilir ve uygulayabilirsiniz. default() veya özel bir yöntem geçirin default fonksiyona json.dump() / json.dumps()Bu özel kanca, JSON'a dönüştürülebilir bir şey döndürmelidir (örneğin bir dict or list), veya yükseltmek TypeError Verilen nesneyi nasıl işleyeceğini bilmiyorsa.
Modülün arka planında ayrıca şu gibi yöntemler de bulunmaktadır: encode() hem de iterencode(), Python verilerini JSON dizelerine dönüştüren, iterencode() Kodlanmış parçaları artımlı olarak sunarlar. Bunlar doğrudan daha az kullanılır, ancak çok büyük JSON yanıtlarını akış halinde işlemeniz gerekiyorsa bilmeye değerdir.
Python Nesnelerini JSON'a Dönüştürme
Python verilerini JSON metnine dönüştürmek istediğinizde, şunu kullanırsınız: json.dump() or json.dumps(), Dosyaya doğrudan yazmak mı yoksa belleğe JSON dizesi almak mı istediğinize bağlıdır. Her iki işlev de dönüştürmenin nasıl davranacağını kontrol etmenizi sağlayan aynı temel parametreleri paylaşır.
Bu fonksiyon json.dump(obj, fp, ...) Bir Python nesnesi ve dosya benzeri bir nesne alır, ve JSON formatında bir temsilini yazar. obj Bu dosyaya. Bellekteki karşılığı, json.dumps(obj, ...)Dosyaya yazmak yerine JSON dizesi döndürür. Her ikisi de bir dizi anahtar kelime argümanı kabul eder, örneğin: skipkeys, ensure_ascii, check_circular, allow_nan, indent, separators, default, ve sort_keys.
Bu seçeneklerin her biri, gerçek projelerde büyük önem taşıyan şekillerde kodlama davranışını değiştirir: Geçersiz tuşları atlamayı, ASCII çıktısını zorlamayı, sonucu düzgün biçimlendirmeyi, boşlukları kontrol etmeyi, standart olmayan nesneler için özel serileştirme tanımlamayı veya test ve farklar için tuş sıralamasını sabitlemeyi seçebilirsiniz.
İşte temel parametrelerin pratik anlamdaki karşılığı:
skipkeys: ayarlanırsaTrue, türünde olmayan sözlük anahtarlarıstr,int,float,boolorNoneyükseltilmek yerine sessizce atlanıyorTypeErrorEğer tuşlar garip olduğunda hızlı hata verme davranışını tercih ediyorsanız, olduğu gibi bırakın.False.ensure_ascii: ne zamanTrue(varsayılan olarak), ASCII olmayan ve yazdırılamayan karakterler kaçış karakteriyle belirtilir (örneğin şu şekilde):\uXXXXBöylece çıktı tamamen ASCII kalır.FalseUnicode karakterler olduğu gibi yazılır; bu genellikle insan tarafından okunabilir yapılandırma dosyaları veya günlükler için daha iyidir.check_circular: ifTrueKodlayıcı, sonsuz özyinelemeyi önlemek için listelerde, sözlüklerde ve özel olarak kodlanmış nesnelerde döngüsel referansları kontrol eder. Bunu şu şekilde ayarlamak:FalseBu durum, söz konusu güvenlik ağını devre dışı bırakır ve şunlara yol açabilir:RecursionErrorYapılarınız kendi kendine gönderme yapıyorsa.allow_nan: ifTrue, özel kayan noktalı değerler gibiNaN,Infinity, ve-InfinityBunlar, belirtilen şartnameye göre kesin olarak geçerli JSON olmasalar bile, JavaScript ile uyumlu bir şekilde kodlanmalarına izin verilir.FalseBu tür değerleri kodlamaya çalışmak hata verecektir.ValueError.indent: Güzel yazdırmayı kontrol eden negatif olmayan bir tamsayı (veya bir dize). Pozitif bir sayı, iç içe geçmiş her seviye için o kadar boşluk anlamına gelir. Bir dize (örneğin"\t") doğrudan girinti için kullanılır.None(Varsayılan) gerekli olanın ötesinde fazladan satır sonu karakteri içermeyen en kompakt gösterimi seçer.separators: bir demet(item_separator, key_separator)Öğeler arasında ve anahtarlar ile değerler arasında noktalama işaretlerini ve boşlukları kontrol etmek. En derli toplu JSON için genellikle şunu kullanırsınız:(",", ":")Tüm isteğe bağlı boşlukları kaldırmak için.default: Kodlayıcının nasıl işleyeceğini bilmediği herhangi bir nesneyi alan bir fonksiyon. JSON'a dönüştürülebilir bir yedek nesne döndürmelidir (örneğin birdictorlist), veya yükseltmekTypeErrorBu, kendi sınıflarınızı serileştirilebilir hale getirmenin ana yoludur.sort_keys: ifTrueSözlükler, anahtarları sıralı olarak kodlanır. Bu, JSON çıktılarının çalıştırmalar arasında istikrarlı olmasını istediğiniz regresyon testleri ve tekrarlanabilir çıktılar için son derece kullanışlıdır.
Somut bir örnek olarak, karışık bir Python listesine sahip olduğunuzu hayal edin. İçinde tamsayılar ve bir isim, bir kimlik ve ondalık sayı puanı içeren bir sözlük bulunan bir JSON verisi oluşturup saklayabilirsiniz. JSON'u şu şekilde oluşturup saklayabilirsiniz:
import pathlib
import json
path = pathlib.Path("myTextFile.json")
data =
with path.open(mode="wt") as f:
json.dump(data, f)
print(json.dumps(data, indent=4))
Yazdırılan JSON, sayesinde düzgün bir şekilde biçimlendirilecektir. indent=4, Her liste öğesini ve sözlük anahtarını ayrı bir satırda gösterir. Bu, tek ve yoğun bir metin satırına kıyasla hata ayıklamayı ve manuel düzenlemeyi çok daha kolay hale getirir.
JSON Verilerini Python'a Geri Ayrıştır
JSON metninden tekrar Python nesnelerine geçmek için, Eşleşen fonksiyon çiftini kullanırsınız: json.load() (dosya benzeri nesneler için) ve json.loads() (JSON dizeleri için). Bu fonksiyonlar girdiyi ayrıştırır ve daha önce olduğu gibi aynı eşleme tablosuna göre Python türlerini yeniden oluşturur.
İmzalar kabaca şöyle görünüyor: json.load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, kw) hem de json.loads(s, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, kw)Temel düzeyde, bunları yalnızca JSON girdisiyle çağırabilirsiniz, ancak ek argümanlar daha gelişmiş ayrıştırma davranışına olanak tanır.
Kancalar gibi object_hook hem de object_pairs_hook JSON nesnelerinin Python yapılarına nasıl dönüştürüleceğini özelleştirmenize olanak tanır. size ya çözülmüş olanı vererek dict veya listesi (key, value) Bu, JSON'dan doğrudan özel sınıflar oluşturmak veya sıralamayı belirli bir şekilde korumak istediğinizde kullanışlıdır.
Diğer çağrılabilir işlevler, örneğin parse_float, parse_int, ve parse_constant Bu özellik, sayıların ve özel belirteçlerin nasıl yorumlanacağını kontrol etmenizi sağlar. Örneğin, şunu kullanmak isteyebilirsiniz: Decimal yerine float parasal değerler için veya dönüştürmek "NaN", "inf", ve "-inf" Seçtiğiniz gözetleme nesnelerine dönüştürün.
Önceki örneğe devam edecek olursak, yazdığınız JSON dosyasını şu şekilde okuyabilirsiniz:
with path.open(mode="rt") as f:
data = json.load(f)
print(data)
Elde edilecek çıktı, standart bir Python listesi ve sözlüğü olacaktır. örneğin Bu verileri, Python'ın alışılagelmiş tüm işlemleriyle manipüle edebilirsiniz. Kodunuzun bakış açısından, bu yine "sadece veri"dir.
Python hangi veri tiplerini JSON'a dönüştürebilir?
Her Python nesnesi, varsayılan ayarlarla JSON'a dönüştürülemez. Bu nedenle izin verilen kümeyi hatırlamak faydalıdır. Pratik kodlayıcılar, yaygın kapsayıcı ve skalar tiplerin yanı sıra Boolean ve Noneve bunları minimum JSON türleri kümesine eşleyin.
Varsayılan olarak, aşağıdaki Python nesnelerini güvenle aktarabilirsiniz. json.dumps():
dict(JSON nesneleri olarak kodlanmıştır)listhem detuple(JSON dizileri olarak kodlanmıştır)str(JSON dizeleri olarak kodlanmıştır)inthem defloat(JSON sayıları olarak kodlanmıştır)Truehem deFalse(kodlanmış olarak)truehem defalse)None(kodlanmış olarak)null)
Python bunları kodladığında, JSON'a geri dönüştürme işlemi oldukça basittir. Kod çözme işleminde de durum tam tersidir. Örneğin, bir Python tuple Bu bir JSON dizisine dönüşür ve siz de bir şey elde edersiniz. list Yükleme sırasında geri döner. Türetilen numaralandırmalar. int or float Sayılar olarak da kodlanabilirler.
Geri kalan her şey ya özel bir tasarıma ihtiyaç duyar. default işleyicisi (nesneleri serileştirilebilir bir gösterime dönüştürmek için) veya neden olacaktır TypeErrorBu bilinçli bir tasarımdır: JSON veri içindir, rastgele nesne grafikleri, davranış ve yöntemler içeren nesneler için değil; tıpkı sizin kullandığınız gibi seri hale getirmek için değil. pickle.
Günlük işlerin büyük çoğunluğu için, bu türler alt kümesi kullanım durumlarının çoğunu kapsar. API yükleri, yapılandırma ağaçları, kullanıcı tercihleri, temel günlükler ve prototipler veya tek kullanıcılı araçlar için küçük "veritabanı benzeri" dosyalar dahil.
Güzel Yazdırma, Kompakt Çıktı ve Sıralı Tuşlar
Ham JSON çıktısı genellikle tamamen geçerlidir ancak okunması zordur. Çünkü genellikle gereksiz boşluklar olmadan oluşturulur. Hata ayıklama, günlük kaydı tutma veya diğer geliştiricilerle paylaşma için, tek satırlık bir kod yerine genellikle okunabilir, girintili JSON istersiniz.
MKS indent parametresi json.dumps() Güzel baskı için ana kaldıraçtır, Python'a her girinti seviyesi için kaç boşluk (veya hangi dize) kullanılacağını söylemenizi sağlar. Tipik bir seçim şudur: indent=4Bazı kod tabanları iki boşluk veya sekme karakterini tercih etse de, stilistik kurallar projeler arasında değişiklik gösterir.
MKS separators Bu argüman, boşluk kullanımını daha da hassas bir şekilde ayarlamanıza olanak tanır. bir demet vermek gibi (", ", ": ") Varsayılan olarak, insan dostu çıktı için kullanılır. Mümkün olan en kompakt gösterimi istiyorsanız (örneğin, ağ üzerinden veri yükünün boyutunu küçültmek için), bunu ayarlayabilirsiniz. separators=(",", ":") Virgül ve iki nokta üst üste işaretlerinden sonraki boşlukları kaldırmak için.
Örneğin birim testlerinde veya anlık görüntü karşılaştırmalarında olduğu gibi, kesin sonuçlara önem verdiğinizde, aktive sort_keys=True Kodlayıcı, sözlük anahtarlarını sıralı bir şekilde çıktı olarak verir. Bu sayede, anlamsal olarak özdeş veriler üreten iki çalıştırma, sözlüklerin anahtarları farklı bir sırayla çıktı vermesi nedeniyle farklılık göstermez.
Birlikte, indent, separators, ve sort_keys size çok fazla kontrol imkanı verir JSON dosyanızın makineler için (kompakt, boşluksuz) mi yoksa insanlar için (girintili, hizalı, çalıştırmalar arasında istikrarlı bir şekle sahip) mi optimize edildiği konusu.
İç İçe Geçmiş Veriler, Ayrıştırma Stratejileri ve Erişim Kalıpları
Gerçek dünyadaki JSON'da düz yapılar istisnadır; Genellikle iç içe nesneler ve dizilerle uğraşacaksınız. Bir e-ticaret uygulamasındaki tipik bir kullanıcı kaydını düşünün: kişisel bilgiler, iç içe gönderim adresleri, iç içe faturalama bilgileri ve belki de sipariş listesi; bunların her biri kendi başına karmaşık bir yapıdır.
JSON verilerini Python'a dönüştürürken, iç içe geçmiş veriler sözlük ve liste kombinasyonlarına dönüşür. Ve standart indeks ve anahtar aramaları kullanarak ona erişebilirsiniz. Sığ yapılar için bu oldukça basittir: data, dataVe benzeri.
Derinlemesine iç içe geçmiş veya dinamik yapılar için daha genel bir yaklaşımı tercih edebilirsiniz. Örneğin, anahtarları arayan veya sözlük ve listelerden oluşan bir ağacı dolaşan küçük bir özyinelemeli fonksiyon yazmak gibi. Özyinelemeli çözümler, keyfi olarak iç içe geçmiş verilerde gezinirken genellikle yinelemeli çözümlerden daha kısa ve okunması daha kolaydır.
İç içe geçmemiş (düz) JSON'a, sabit kodlanmış anahtarlarla doğrudan erişmek daha kolaydır. Bu durum, küçük yardımcı programlar veya girdiyi tamamen kontrol ettiğiniz durumlarda gayet uygun olabilir. Ancak harici API'leri kullanırken, yapıyı kapsayan küçük yardımcı fonksiyonlar yazmak yaygındır, böylece gereksiz yere veri serpiştirmezsiniz. Kod tabanınızın her yerine yayılan zincirler.
Derinliğinden bağımsız olarak, aynı json.loads() Davranış şu şekilde uygulanır: Bu fonksiyon bir JSON dizesi alır ve daha sonra normal Python araçlarıyla işleyebileceğiniz yerel Python türleri üretir. Normalin ötesinde özel bir sözdizimi gerekmez. dict hem de list indeksleme.
JSON Dosyalarıyla Çalışma: Okuma, Yazma ve Ekleme
JSON, şaşırtıcı derecede kullanışlı ve hafif bir depolama formatıdır. Küçük projeler, yapılandırma dosyaları veya kalıcı bir durum tutması gereken komut dosyaları için. Doğrudan tam bir veritabanına başvurmak yerine, genellikle bir veya iki JSON dosyasıyla uzun süre idare edebilirsiniz.
JSON verilerini bir dosyaya yazmak genellikle iki aşamalı bir işlemdir: Python verilerini serileştirme json.dumps() veya doğrudan json.dump()ve ardından elde edilen dizenin diske yazıldığından emin olun. Eğer çağırırsanız open('data.json', 'w')Yazma modunda, dosyayı oluşturan veya zaten varsa silen bir dosya tanıtıcısı elde edersiniz.
İç içe geçmiş yapılar için protokol, düz verilerden farklı değildir: hala aynısını kullanıyorsunuz json.dump() Çağrı yapıldığında, iç içe geçmiş liste ve sözlük kombinasyonları özyinelemeli olarak kodlanır. Genellikle vermeniz gereken tek karar, okunabilirlik ve dosya boyutu için ne kadar girinti istediğinizdir.
Dosyadan JSON okumak ise bunun tam tersidir: dosyayı metin modunda açın, Dosya nesnesini şuraya iletin: json.load()Ve Python veri yapınızı geri alırsınız. Tekrar belirtmek gerekirse, davranış iç içe geçmenin derinliğinden bağımsızdır; kod çözücü tüm bunları sizin için halleder.
Mevcut dosyalara JSON verisi eklemeniz gerekiyorsa, İşler daha karmaşık bir hal alıyor. JSON'un kendisi, dosyanın tamamının geçerli JSON olması gerektiğinden, "akışlı ekleme"yi basit bir şekilde desteklemiyor. Yaygın bir yöntem, kayıtların bir dizisini saklamak ve tüm diziyi okumak/değiştirmek/yazmak veya her satırın ayrı bir JSON nesnesi olduğu ve önceki satırları yeniden yazmadan ekleme yapabileceğiniz satır ayırıcı JSON kullanmaktır.
Gerçek Dünyada JSON: API'ler, Depolama ve Veri Değişimi
Gerçek uygulamalar geliştirmeye başladığınızda, JSON hızla birleştirici bir unsur haline gelir. Web istemcilerini ve sunucularını, mikro hizmetleri ve üçüncü taraf API'lerini birbirine bağlayan bir yapıdır. Hem kompakt olması hem de insanların onu makul ölçüde kolayca okuyup düzenleyebilmesi nedeniyle değerlidir.
API etkileşiminde JSON, açık ara en yaygın veri formatıdır. Özellikle RESTful servislerde. Python uygulamaları tipik olarak şu kütüphaneleri kullanır: requests HTTP isteklerini göndermek ve JSON yanıtlarını almakdaha sonra bu yanıtları şu şekilde ayrıştırın: json.loads() veya onu saran yardımcı yöntemlerle.
JSON, yapılandırma dosyaları ve günlükler için de popüler bir formattır. Yapılandırılmış, anahtar-değer ilişkisine dayalı yapısı sayesinde düz metne göre çok daha ifade gücü yüksekken, tam teşekküllü veritabanlarına kıyasla da basit kalmaktadır. Sistem bileşenleri JSON aracılığıyla yapılandırmayı paylaşabilir ve günlük toplayıcılar JSON günlüklerini daha kolay filtrelemek veya analiz etmek için ayrıştırabilir.
Bir diğer önemli kullanım alanı ise veri yapılarının serileştirilmesi ve seri durumdan çıkarılmasıdır. Bellekteki koleksiyonları JSON dizelerine dönüştürmek (serileştirme) ve daha sonra yeniden oluşturmak (serileştirmeyi tersine çevirme). Kullanıcı tercihlerini bu şekilde saklarsınız. yapılandırılmış mesajlar iletmek JSON uyumlu türlere bağlı kalmanız veya özel kodlayıcılar sağlamanız koşuluyla, kuyruklar aracılığıyla veya hizmet sınırları arasında iç içe nesneler gönderebilirsiniz.
Sadece JSON ile sınırlı kalmayıp, Python kodunun sıklıkla JSON ile diğer formatlar arasında dönüştürme yapması da gerekir. XML, CSV veya düz metin gibi. Örneğin, eski bir sistemden CSV okuyabilir, bunu sözlük listesine dönüştürebilir ve ardından modern bir API için JSON olarak dışa aktarabilirsiniz. Veya bir API'den JSON çekebilir, normalleştirebilir ve analistlerin elektronik tablolara yüklemesi için CSV yazabilirsiniz.
JSON Üzerinde Biçimlendirme, Doğrulama ve Ek İşlemler
Temel okuma ve yazma becerilerinde rahatladıktan sonra, İş akışınızı iyileştirmek için JSON verileri üzerinde gerçekleştirebileceğiniz bir dizi küçük ama kullanışlı işlem vardır: okunabilirliği artırmak için biçimlendirme, iç içe yapıları düzleştirme, bir dizenin gerçekten JSON olduğunu doğrulama ve tutarlı karşılaştırmalar için verileri sıralama.
Güzel baskı ile json.dumps(..., indent=...) ilk adımdır, Bu sayede yapısal sorunları bir bakışta tespit etmeyi kolaylaştıran, düzenli aralıklarla yerleştirilmiş hiyerarşiler elde edersiniz. Bu, özellikle hata ayıklama sırasında veya dokümantasyonda örnekler paylaşırken çok faydalıdır.
İç içe geçmiş JSON dosyalarını düzleştirmek, sonraki işlem ve analizleri kolaylaştırabilir. Özellikle verileri CSV gibi tablo formatına dönüştürmeniz veya derinlemesine iç içe geçmiş nesneler yerine anahtar-değer çiftleri bekleyen araçlara beslemeniz gerekiyorsa, düzleştirme işlemi genellikle sözlükler ve listeler üzerinde özyinelemeli veya yinelemeli geçiş kullanarak kendiniz uygulanır.
JSON verilerinin doğrulanması genellikle onu ayrıştırmaya ve istisnaları yakalamaya indirgenir. Özellikle de bir dizenin sözdizimsel olarak doğru olup olmadığını doğruluyorsanız. Daha titiz kontroller için JSON Şeması ve harici kütüphaneler kullanabilirsiniz, ancak çoğu durumda basit bir yöntem yeterlidir. try/except etrafında json.loads() yeterlidir.
JSON verilerini belirli değerlere veya anahtarlara göre sıralamak, yanıtları karşılaştırırken yardımcı olabilir. Testler için kararlı anlık görüntüler oluşturmak veya benzer nesnelerin birlikte gruplandırıldığından emin olmak gibi işlemler için, altta yatan Python listelerini ve sözlüklerini dökümden önce sıralayabilir veya şunlara güvenebilirsiniz: sort_keys=True Nesneler içindeki anahtar sıralamasına odaklanıldığında.
JSON ile Çalışırken Hata Yönetimi
İyi yapılandırılmış sistemler bile hatalı JSON dosyalarıyla veya beklenmedik verilerle karşılaşabilir. Dolayısıyla JSON ayrıştırma ve kodlama etrafında sağlam hata yönetimi çok önemlidir. Python bu sorunları istisnalar aracılığıyla ifade eder ve bunlarla başa çıkmanın en yaygın yolu, işlemleri bir sarmal içine almaktır. try...except blokları.
JSON'u çözümlerken en sık karşılaşılan sorun geçersiz sözdizimidir. Örneğin, mülk adlarının etrafında tırnak işaretlerinin olmaması veya sondaki virgüllerin eksik olması gibi. json Bu modül bir kod çözme hatası verecektir (genellikle json.JSONDecodeError(Bu verileri yakalayabilir, kaydedebilir veya kullanıcı dostu mesajlara dönüştürebilirsiniz.)
Örneğin, bozuk bir dizeyi ayrıştırmaya çalışmak şu gibi bir hataya yol açabilir: Failed to decode JSON: Expecting property name enclosed in double quotes: line 1 column 29 (char 28)Bu tür bir mesaj, yalnızca ayrıştırmanın başarısız olduğunu değil, ayrıştırıcının girişte nerede karışıklık yaşadığını da gösterir.
Kodlama tarafında ise şunlarla karşılaşabilirsiniz: TypeError Desteklenmeyen türleri serileştirmeye çalışırken, or ValueError izin vermezseniz NaN ve sonsuzluklar aracılığıyla allow_nan=False Ancak verileriniz bu tür değerler içeriyor. Kapsayıcılardaki döngüsel referanslar da tetikleyici olabilir. RecursionError Dairesel kontrolleri devre dışı bırakırsanız.
En iyi uygulama, JSON işlemlerini hataya açık G/Ç işlemleri olarak ele almaktır. Özellikle ağ kaynaklarından veya harici dosyalardan okuma yaparken: her zaman bir şeylerin ters gidebileceğini varsayın ve buna göre istisnaları yakalayın, verilerinize daha spesifik kısıtlamalar getirmek için doğrulama katmanları ekleyin. json.loads() veya API yardımcı yöntemlerinde try...except Bloklar, kodunuzun geri kalanını zincirleme hatalardan korur ve geri dönüş yapmanıza olanak tanır. kullanıcı dostu JSON hataları Gerektiğinde müşterilere.
Python'da Web API'leriyle JSON Kullanımı
Python'dan iletişim kurduğunuz web API'lerinin çoğu JSON formatında veri gönderir ve alır. ve tipik geliştirme yığını şunları birleştirir: requests HTTP için kütüphane ile json (JSON ayrıştırma ve oluşturma için) modül. Bu kombinasyon, API entegrasyonunu çok doğal hissettiriyor.
Sık kullanılan bir yöntem, bir API uç noktasına çağrı yapmaktır; Yanıt durum kodunun başarıyı gösterdiğinden emin olun ve ardından JSON gövdesini ayrıştırBuradan alanlara erişebilir, iç içe geçmiş verileri işleyebilir ve yanıtı kendi etki alanı modellerinize veya görünüm nesnelerinize eşleyebilirsiniz.
Ağ üzerinden yapılan çağrılar söz konusu olduğunda hata yönetimi daha da önem kazanır. Çünkü yalnızca geçersiz JSON ile değil, aynı zamanda zaman aşımı, bağlantı hataları veya JSON yerine HTML ile yanıt veren sunucu tarafı hatalarıyla da karşılaşabilirsiniz. (Sarmalama) json.loads() veya API yardımcı yöntemlerinde try...except Bloklar, kodunuzun geri kalanını zincirleme hatalardan korur.
API JSON, ayrıştırıldıktan sonra diğer Python veri yapıları gibi davranır. Dolayısıyla daha önce ele alınan tüm teknikler (güzel yazdırma, düzleştirme, doğrulama, sıralama) doğrudan uygulanabilir. Python verileri ile JSON arasında rahatça geçiş yapabilmek, hizmetleri birbirine bağlarken verimliliği büyük ölçüde artırır. Eğer odak noktanız şuysa: gerçek uygulamalar geliştirmekJSON işleme kalıplarına erken aşamada dikkat etmek, daha sonra hata ayıklama süresinden tasarruf sağlayacaktır.
Python'da JSON, tek bir fonksiyon çağrısından ziyade bir araç kutusu gibidir: Açık tür eşlemeleri, esnek kodlama parametreleri, özel türler için kancalar, basit ama güçlü dosya G/Ç işlemleri ve dış dünyadan gelen verileri ayrıştırmak, biçimlendirmek ve doğrulamak için sağlam kalıplar; tüm bunlar JSON'u modern veri odaklı uygulamalarla uğraşan Python programcıları için doğal bir uyum haline getiriyor.