2011-08-29 9 views
5

Często używam JSON do edytowania przez użytkownika plików konfiguracyjnych. Zniekształcony JSON jest oczywiście odbierany przez mnie json.loads, ale czasami są błędy, których nie znajduję, dopóki nie przejdę przez wynikowe dykty/listy/ciągi. Chciałbym móc podać pomocne błędy, takie jak "Niepoprawna wartość" foo "na linii 23", ale kiedy odzyskałem swój dyktat, straciłem mapowanie do oryginalnych numerów linii.Python: biblioteka dekodowania JSON, która może skojarzyć dekodowane elementy z oryginalnym numerem linii?

Możliwe, że ktoś mógł napisać parser JSON, który otagował każdy obiekt wyjściowy za pomocą pewnych metadanych dotyczących miejsca, w którym pojawił się w tekście wejściowym: czy coś takiego istnieje dla Pythona?

Przykład:

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

Po parsowania powyższe, uważam, że „y” nie jest faktycznie wartość prawną „bar”, i chciałbym wiedzieć, że pochodził z numerem linii 2.

+0

Niestety uważam, że nie ma takiej biblioteki dla Pythona, a przynajmniej nie widziałem tej funkcji w głównych bibliotekach JSON (json, simplejson, Jansson). –

Odpowiedz

-1

Jeśli użyjesz json.load() i przekażesz otwarty uchwyt pliku, każda otrzymana wiadomość o błędzie będzie zawierała numer wiersza i kolumny. Jeśli wyjątek to ValueError, odpowiedni komunikat powinien być odpowiedni do przekazania do użytkownika.

+0

Oczywiście, już dostaję ładne komunikaty o błędach składniowych na poziomie JSON . Pytanie dotyczy radzenia sobie z błędami, których nie znajduję, dopóki nie przejdę przez powstałe obiekty. – kdt

+1

Przepraszamy, źle zrozumiałem pytanie. –

0

AFAIK, co chcesz, nie istnieje, ale mam pomysł, jak można realizować go, jeśli jesteś zainteresowany ...

Moduł json ma hak do dekodowania obiektów której mógł (mis-) używać do sprawdzania poprawności obiektu w czasie dekodowania. Jednak nie rozwiąże to problemu, ponieważ hak nie otrzyma informacji o numerze linii. Problem jest jeszcze bardziej skomplikowany, ponieważ w Pythonie 2.7+ nie pojawiają się już komunikaty o błędach line-by-line. Dostajesz je tylko z czystego dekodera Python JSON, a nowsze wersje używają (znacznie szybszej) biblioteki C.

Mamy dwa problemy do rozwiązania.

1) można użyć dekodera czystego Pythona przez instacji json.JSONDecoder tak:

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) Aby otrzymać walidacji trzeba wymienić json.decoder.JSONObject z metody, która robi całkiem to samo, ale także przekazuje informacje o numerze linii do Twojej procedury sprawdzania poprawności.

Powiązane problemy