2011-08-29 11 views
5

Kullanıcı tarafından düzenlenebilir yapılandırma dosyaları için sıklıkla JSON kullanıyorum. Yanlış biçimlendirilmiş JSON tabiki benim için json.loads tarafından alınır, ancak bazen ortaya çıkan dicts/lists/dizeleri geçene kadar bulamadığım hatalar vardır. "23'teki geçersiz değer 'foo' gibi yararlı hatalar vermeyi isterdim, ama geri dönünümü geri döndüğümde, orijinal satır numaralarına herhangi bir eşleme kaybettim.Python: Kod çözülmüş öğeleri orijinal satır numarasıyla ilişkilendirebilen JSON kod çözme kitaplığı?

Birisi o giriş metninde nerede göründüğüne dair bazı meta veri ile her çıktı nesnesini etiketli bir JSON ayrıştırıcı yazılı olması mümkün görünüyor: Böyle bir şey piton için vardır?

Örnek:

1. [{"foo": "x"}, 
2. {"bar": "y"}] 

yukarıdaki ayrıştırma sonra "y" aslında "bar" için yasal bir değer olmadığını fark ve bunu hat numarasından geldiğini bilmek istiyorum Eğer json.load() kullanın ve bir açık dosya koluna geçmesi durumunda 2.

+0

Maalesef, Python için böyle bir kütüphanenin bulunmadığına inanıyorum, ya da en azından bu özelliği büyük JSON libs'te görmedim (json, simplejson, Jansson) –

cevap

-1

elde edersiniz herhangi bir hata mesajı bir çizgi ve sütun numarası olacaktır. İstisna bir ValueError ise, ilgili mesaj kullanıcıya iletilmek için uygun olmalıdır.

+0

Elbette, JSON seviyesindeki sözdizimi hataları için zaten güzel mesajlar alıyorum . Soru, sonuçta ortaya çıkan nesnelere gidene kadar bulamadığım hataların üstesinden gelmek. – kdt

+1

Üzgünüm, soruyu yanlış anladım. –

0
json modülü hangi yapabildin nesneleri kodunu çözmek için bir kanca (sahiptir

mevcut değil istiyorum ama eğer ilgilenirsen bunu uygulamak nasıl bir fikrim var

AFAIK ... mis) decode-time nesne doğrulama yapmak için kullanın. Ancak bu sorununuzu çözmez, çünkü kanca hat numarası bilgisini almaz. Sorun daha da karmaşıktır çünkü Python 2.7+ sürümünde satır içi hata mesajları almıyorsunuz. Bunları sadece Python JSON kod çözücüsünden elde edersiniz ve daha yeni sürümler (daha hızlı) C kütüphanesi kullanır.

yüzden çözmek için iki sorun var.

1) şöyle json.JSONDecoder sınıflara göre saf-piton kod çözücüyü kullanabilirsiniz: oldukça yapan bir yöntemle json.decoder.JSONObject değiştirmeniz gerekiyor senin doğrulama almak için)

class PyDecoder(json.JSONDecoder): 
    def __init__(self, encoding=None, object_hook=None, parse_float=None, 
      parse_int=None, parse_constant=None, strict=True, 
      object_pairs_hook=None): 
     super(PyDecoder, self).__init__(encoding, object_hook, parse_float, 
             parse_int, parse_constant, strict) 
     self.scan_once = json.scanner.py_make_scanner(self) 

2 Aynı şey, ama aynı zamanda satır numarası bilgilerini doğrulama rutininize geçirir.