İçeriğe geç

Menü

Berk Akademi
Birebir ders başvurusu Ücretsiz ön görüşme Ana Sayfa

Python "Expecting property name enclosed in double quotes: line 1 column 2 (char 1)" Hatası Nasıl Çözülür?

python-expecting-property-name-enclosed-in-double-quotes-line-1-column-2-char-1-hatasi-nasil-cozulur
Bu yazıda neler var?
  1. Hata neyi anlatır ve ilk düzeltme nedir?
  2. Python sözlüğü ile JSON metnini nasıl ayırırsın?
  3. Hatalı girdiyi çalışan json.loads() koduna nasıl dönüştürürsün?
  4. line, column ve char değerleri nasıl okunur?
  5. json.loads(), json.load(), json.dumps() ve json.dump() farkı nedir?
  6. Komut satırında JSON nasıl doğrulanır ve hata nasıl tekrarlanmaz?
  7. Sık Sorulan Sorular

Python Expecting property name enclosed in double quotes: line 1 column 2 (char 1) hatası, JSON ayrıştırıcısının nesnedeki özellik adını çift tırnak içinde beklediğini gösterir. Hata çoğunlukla {'name': 'Ada'} gibi Python sözlüğü gösteriminin JSON metni sanılarak json.loads() ile okunmaya çalışılmasıyla oluşur. Çözüm, girdiyi geçerli JSON biçimine dönüştürmektir.

İlk kontrolde anahtarların ve metin değerlerinin çift tırnak kullandığına, anahtarların tırnaksız bırakılmadığına ve nesnenin sonunda fazladan virgül bulunmadığına bakmalısın.

Hata neyi anlatır ve ilk düzeltme nedir?

JSON içinde özellik adı olarak kullanılan name gibi anahtarlar çift tırnakla yazılır. {'name': 'Ada'} ifadesi Python içinde geçerli bir sözlük olabilir, ancak JSON değildir. {name: "Ada"} örneğinde ise anahtar tamamen tırnaksız bırakılmıştır. Geçerli JSON biçimi {"name": "Ada"} şeklindedir.

Hızlı bir düzeltme yaparken tek tırnakları metnin her yerinde körlemesine çift tırnağa çevirmek yerine JSON yapısını kontrol et. Çünkü metin değerlerinin içinde tek tırnak, kaçış karakterleri veya başka biçim hataları bulunabilir. Ayrıca JSON verisini Python kodu gibi çalıştırmak için eval() kullanma; metni json modülüyle ayrıştır.

import json

hatalı_metin = "{'name': 'Ada'}"
# json.loads(hatalı_metin)  # JSONDecodeError verir

geçerli_metin = '{"name": "Ada"}'
veri = json.loads(geçerli_metin)

print(veri["name"])

Beklenen çıktı:

Ada

Sondaki virgül de benzer bir hata oluşturabilir. Örneğin {"name": "Ada",} içinde son özellikten sonra yeni bir özellik beklenir. Bu nedenle hata line 1 column 2 yerine virgülün bulunduğu veya kapanış karakterinin geldiği farklı bir satır ve sütunda gösterilebilir.

Python sözlüğü ile JSON metnini nasıl ayırırsın?

Python sözlüğü ile JSON metnini nasıl ayırırsın?

Python sözlüğü, Python programının doğrudan kullandığı bir nesnedir. JSON ise veriyi metin olarak temsil eden, kendi yazım kuralları bulunan bir biçimdir. Bu ayrım önemlidir: json.loads() JSON metnini Python nesnesine dönüştürür. Elinde zaten Python sözlüğü varsa bunu json.loads() içine vermek yerine doğrudan kullanabilir veya JSON metni gerekiyorsa json.dumps() ile dönüştürebilirsin.

örnek türü belirti hata konumu uygun düzeltme
Python sözlüğü biçimindeki {'name': 'Ada'} Tek tırnak kullanılır; bu ifade Python içinde sözlük nesnesidir. line 1 column 2 (char 1) Sözlüğü doğrudan kullan veya JSON metni için json.dumps() çağır.
Tırnaksız anahtarlı geçersiz JSON {name: "Ada"} Özellik adı çift tırnak içine alınmamıştır. line 1 column 2 (char 1) {"name": "Ada"} biçimine getir.
Sondaki virgülü bulunan geçersiz JSON {"name": "Ada",} Son virgülden sonra yeni bir özellik beklenir. line 1 column 16 (char 15) Kapanış süslü parantezinden önceki virgülü kaldır.
Geçerli JSON {"name": "Ada"} Özellik adı ve metin değeri çift tırnaklıdır. Hata oluşmaz json.loads() ile ayrıştır.

Bu ayrımı pekiştirmek için ücretsiz Python bilgi testini çözebilir, temel söz dizimini yeniden gözden geçirmek için ücretsiz Sıfırdan Temel Python video eğitiminden yararlanabilirsin.

Hatalı girdiyi çalışan json.loads() koduna nasıl dönüştürürsün?

Bu hata, JSON ayrıştırıcısının özellik adlarını çift tırnak içinde beklediğini, ancak girdide tek tırnaklı veya tırnaksız bir anahtar bulunduğunu gösterir. Çözüm, metni geçerli JSON biçimine getirip json.loads() ile ayrıştırmaktır.

Hatalı JSON metni:

import json

hatali_json = "{'ad': 'Ada', 'puan': 95}"
json.loads(hatali_json)

JSON içinde hem özellik adları hem de metin türündeki değerler çift tırnakla yazılır. Düzeltilmiş ve çalışan örnek şöyledir:

import json

json_metni = '{"ad": "Ada", "puan": 95}'
veri = json.loads(json_metni)

print(veri)
print(type(veri).__name__)

Beklenen çıktı:

{'ad': 'Ada', 'puan': 95}
dict

Girdide çift tırnak kullanılmasına rağmen çıktıda tek tırnak görmen normaldir. Çünkü json.loads(), JSON metnini Python sözlüğüne dönüştürür ve Python sözlüklerini kendi gösterim biçimiyle yazdırır.

Tırnaksız anahtarlar da geçerli JSON değildir:

import json

hatali_json = '{ad: "Ada"}'
json_metni = '{"ad": "Ada"}'

veri = json.loads(json_metni)
print(veri)

Burada ad anahtarının çift tırnak içine alınması yeterlidir. Ancak bütün tek tırnakları metin içinde otomatik olarak çift tırnağa çevirmek güvenli bir çözüm değildir. Örneğin Ali'nin kitabı ifadesindeki kesme işareti de değiştirilirse metnin anlamı bozulabilir ve yeni bir tırnak hatası oluşabilir. Veriyi metin değiştirme işlemiyle düzeltmek yerine JSON'u doğru biçimde üretmek daha güvenlidir.

eval() kullanmak da uygun değildir. eval(), veriyi yalnızca JSON olarak ayrıştırmaz, Python kodu gibi çalıştırabilir. Özellikle dış kaynaktan gelen bir metinde bu yaklaşım güvenlik riski oluşturur ve geçerli JSON kurallarını denetlemez.

line, column ve char değerleri nasıl okunur?

line, column ve char değerleri nasıl okunur?

Hata mesajındaki line ve column değerleri birden başlar. char değeri ise metnin başından itibaren sıfırdan sayılan karakter konumudur. Bu değerler, ayrıştırıcının geçersiz yapıyı fark ettiği yeri gösterir; biçim hatasının ilk nedeni birkaç karakter önce veya önceki satırda bulunabilir.

Örneğin aşağıdaki JSON metninde son elemandan sonra gereksiz bir virgül vardır:

{
  "ad": "Ada",
  "puan": 95,
}

Ayrıştırıcı, yeni bir özellik adı beklerken kapanış süslü parantezini gördüğü için hatayı çoğu zaman bu paranteze yakın bir sütunda veya sonraki satırın başında bildirir. Asıl sorun ise bir önceki satırdaki son virgüldür.

Hata konumunu incelemek için şu sırayı izleyebilirsin:

  1. Hata bildirilen konumdan geriye doğru ilerle.
  2. Özellik adlarının çift tırnak içinde olup olmadığını kontrol et.
  3. Her anahtardan sonra iki nokta bulunduğundan emin ol.
  4. Virgüllerin yalnızca iki elemanın arasında kullanıldığını kontrol et.
  5. Süslü parantezlerin ve köşeli parantezlerin doğru sırayla kapanıp kapanmadığını incele.

json.loads(), json.load(), json.dumps() ve json.dump() farkı nedir?

Bu dört işlevi ayırmanın en kolay yolu, elindeki verinin metin mi, dosya mı yoksa zaten oluşturulmuş bir Python nesnesi mi olduğunu belirlemektir. load ve loads JSON verisini Python nesnesine ayrıştırır. dump ve dumps ise Python nesnesini JSON biçimine dönüştürür. s harfi, işlevin bir metinle çalıştığını hatırlatır.

  1. json.loads(), elindeki JSON metnini Python sözlüğüne veya listesine dönüştürür. API yanıtı, kullanıcıdan alınan metin ya da bir değişkende tutulan JSON içeriği için kullanılır.
  2. json.load(), açılmış bir dosya nesnesinden JSON okur. Dosya yolunu doğrudan değil, open() ile açılmış dosyayı alır.
  3. json.dumps(), Python sözlüğü veya listesini JSON metnine dönüştürür. Bu metni ekrana yazdırabilir, bir isteğin gövdesinde kullanabilir ya da başka bir yere aktarabilirsin.
  4. json.dump(), Python nesnesini JSON biçiminde doğrudan bir dosyaya yazar.

Kısa karar çerçevesi şöyledir: Elinde JSON metni varsa loads(), açık bir JSON dosyası varsa load(), zaten oluşturulmuş bir Python sözlüğün varsa metin üretmek için dumps(), dosyaya yazmak için dump() kullanılır.

import json

hatali_json = "{'ad': 'Ada'}"
duzeltilmis_json = '{"ad": "Ada", "puan": 95}'

veri = json.loads(duzeltilmis_json)
metin = json.dumps(veri, ensure_ascii=False)

print(veri["ad"])
print(metin)

hatali_json değişkeni Python sözlüğüne benzese de geçerli JSON değildir. Bu metni json.loads() ile okumaya çalışmak yerine, özellik adlarını çift tırnakla yazarak geçerli JSON üretmek gerekir. Düzeltilmiş kodun beklenen çıktısı şöyledir:

Ada
{"ad": "Ada", "puan": 95}

Dosya kullanırken akış şu şekilde olur:

with open("veri.json", encoding="utf-8") as dosya:
    veri = json.load(dosya)

with open("kopya.json", "w", encoding="utf-8") as dosya:
    json.dump(veri, dosya, ensure_ascii=False, indent=2)

Tek tırnakları metin üzerinde körlemesine çift tırnağa çevirmek güvenilir bir çözüm değildir. Metin değerlerinin içinde kesme işareti bulunabilir veya Python ile JSON arasındaki True, False ve None gibi yazım farkları sorun çıkarabilir. Dönüştürme için eval() kullanmak yerine veriyi doğru JSON biçiminde düzenle veya json.dumps() ile üret.

Komut satırında JSON nasıl doğrulanır ve hata nasıl tekrarlanmaz?

Komut satırında JSON'u hızlıca kontrol etmek için resmî Python belgelerinde python -m json komutu gösterilir. Komut, standart girdiden aldığı JSON'u doğrular ve geçerliyse daha okunabilir biçimde yazdırır.

echo '{"ad": "Ada", "puan": 95}' | python -m json
{
    "ad": "Ada",
    "puan": 95
}

Örneğin tırnaksız bir özellik adı içeren veri doğrulanamaz:

echo '{1.2:3.4}' | python -m json
Expecting property name enclosed in double quotes: line 1 column 2 (char 1)

Temel Python pratiğini küçük örneklerle geliştirmek için ücretsiz Sıfırdan Temel Python video eğitimi ile JSON işlemlerini de çalışabilirsin.

Hatanın tekrarlanmaması için bütün anahtarların çift tırnak içinde olduğundan emin ol, tırnaksız anahtar bırakma ve nesnenin ya da listenin sonunda fazladan virgül bulundurma. Elindeki veri metinse loads(), dosyaysa load() seç; Python nesnesini metne çevirmek için dumps(), dosyaya yazmak için dump() kullan. Hata mesajında bildirilen satır, sütun ve karakter konumundan önceki bölümü de incele.

Sık Sorulan Sorular

Python sözlüğünü json.loads() ile doğrudan okuyabilir miyim?

Hayır. json.loads() JSON içeren bir metin, bayt dizisi veya bayt dizisi benzeri veri bekler. Elinde zaten Python sözlüğü varsa onu doğrudan kullanabilir, JSON metnine ihtiyaç duyuyorsan json.dumps() ile dönüştürebilirsin.

JSON içindeki bütün tek tırnakları çift tırnağa çevirmek doğru mu?

Her zaman doğru değildir. Metin değerlerinin içinde kesme işareti bulunabilir ve Python sözlüğündeki True, False veya None değerleri JSON'da farklı yazılır. Yapıyı elle dikkatlice düzeltmek ya da Python nesnesinden json.dumps() ile geçerli JSON üretmek daha güvenlidir.

line 1 column 2 (char 1) ne anlama gelir?

line 1 ilk satırı, column 2 ikinci sütunu, char 1 ise Python'un sıfır tabanlı karakter konumunda 1 indeksini gösterir. {1.2:3.4} örneğinde bu konum, açılış süslü parantezinden sonraki 1 karakteridir. Parser burada çift tırnakla başlayan bir özellik adı bekler.

json.load() ile json.loads() arasındaki fark nedir?

json.load() açılmış bir dosya nesnesinden JSON okur. json.loads() ise değişkende bulunan JSON metnini Python nesnesine dönüştürür. Kısaca dosya için load(), metin için loads() kullanılır.

JSON metni ile Python sözlüğünü ayırıp doğru işlevi seçtiğinde bu hata daha kolay teşhis edilir ve benzer yazım sorunlarını kod çalışmadan önce fark edebilirsin.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin, yazılım geliştirici ve eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; İzmir Ekonomi Üniversitesi'ni bölüm birincisi ve yüksek şeref öğrencisi olarak tamamladı. Bugün yalnızca eğitim vermekle kalmıyor, sektörde aktif olarak yazılım projeleri geliştiriyor ve gerçek dünya deneyimini birebir derslerine taşıyor. Ezberden uzak, mühendislik zihniyetini merkeze alan sürdürülebilir öğrenme sistemleri tasarlayarak sorgulayan, üreten ve problem çözebilen yeni nesil yazılımcılar yetiştiriyor.

Sektörel Deneyim & Projeler

  • Ticarify Entegrasyon Yazılım logosu CEO Ticarify Entegrasyon YazılımPazaryerleri ve e-ticaret sitelerine otomatik e-fatura kesimi, sipariş ve kargo takibi hizmetleri sunan e-Dönüşüm platformunun API mimarisini ve yazılım ekibini yönetmektedir.
  • Benim Düğünüm logosu CEO Benim DüğünümDijital etkinlik ve anı paylaşım platformu.
  • Siberdizayn logosu Yazılım Ekibi Lideri SiberdizaynYüksek anlık oyuncu trafiğine sahip oyun kontrol panelleri ve sunucu altyapıları geliştiren yazılım ekibine liderlik etmektedir.
  • MEDYOGRAFYA 360° Dijital Çözümler logosu Dijital Strateji Lideri MEDYOGRAFYA 360° Dijital ÇözümlerŞirketlerin dijital çözümlerde uzun vadede nasıl ilerlemesi gerektiği ve dijital dönüşüm süreçlerinin yönetilmesine destek olmaktadır.
  • İzmir Ekonomi Üniversitesi logosu Danışma Kurulu Üyesi İzmir Ekonomi ÜniversitesiMezun olduğu üniversitesinde, Bilgisayar Programcılığı bölümünün akademik müfredatını güncel sektör ihtiyaçlarına göre şekillendirmek adına Danışma Kurulu'nda görev almaktadır.
WhatsApp Hemen Ara