2014-04-28 7 views
8

Mam około 2000 plików JSON, które próbuję uruchomić przez program w języku Python. Problem występuje, gdy plik JSON ma niepoprawny format. (Błąd: ValueError: No JSON object could be decoded) Z kolei nie mogę go odczytać w moim programie.Python: sprawdzanie poprawności i formatowanie plików JSON

Jestem obecnie robi coś jak poniżej:

for files in folder: 
    with open(files) as f: 
     data = json.load(f); # It causes an error at this part 

wiem, że jest niedostępny do walidacji metod i formatowanie plików JSON, ale jest tam programistyczny sposobem sprawdzenia i sformatować te pliki? Jeśli nie, czy istnieje darmowa/tania alternatywa dla utrwalenia wszystkich tych plików w trybie offline, tj. Po prostu uruchom program w folderze zawierającym wszystkie pliki JSON i formatuje je zgodnie z wymaganiami?


rozwiązać za pomocą @ komentarzu Reece za:

invalid_json_files = [] 
read_json_files = [] 
def parse(): 
    for files in os.listdir(os.getcwd()): 
     with open(files) as json_file: 
      try: 
       simplejson.load(json_file) 
       read_json_files.append(files) 
      except ValueError, e: 
       print ("JSON object issue: %s") % e 
       invalid_json_files.append(files) 
    print invalid_json_files, len(read_json_files) 

Okazuje się, że byłem zapisywania pliku, który nie jest w formacie JSON w moim katalogu roboczym, który był w tym samym miejscu czytałem dane. Dzięki za pomocne sugestie.

+0

A jak zamierzasz naprawić te pliki, jeśli nie wiesz, gdzie dokładnie znajduje się błąd? – vaultah

+0

Co nie jest dobrze sformatowane? Zdajesz sobie sprawę, że przesłoniłeś obiekt danych dla każdego pliku, prawda? – Llopis

+0

@frostnational Miałem wrażenie, że program przejrzy niektóre problemy, które mogą wystąpić w plikach JSON i automatycznie naprawi je, jeśli wystąpią. Na przykład. '{text:" foo "} text2:" bar "' -> brak przecinka oddzielającego dwa dykta. @Llopis: tak, robię tak, jak chcę, aby program działał na każdym pliku JSON. Być może dobrze sformatowany może brakować kolumny między dyktami. – Black

Odpowiedz

14

Wbudowany moduł JSON może być stosowany jako weryfikatora:

import json 

def parse(text): 
    try: 
     return json.loads(text) 
    except ValueError as e: 
     print('invalid json: %s' % e) 
     return None # or: raise 

można je pracować z plikami za pomocą:

with open(filename) as f: 
    return json.load(f) 

zamiast json.loads można zawierać nazwę pliku jak również w komunikacie o błędzie.

na Python 3.3.5, dla {test: "foo"}, otrzymuję:

invalid json: Expecting property name enclosed in double quotes: line 1 column 2 (char 1) 

i 2.7.6:

invalid json: Expecting property name: line 1 column 2 (char 1) 

To dlatego, że poprawne json jest {"test": "foo"}.

Podczas obsługi nieprawidłowych plików najlepiej nie przetwarzać ich dalej. Możesz zbudować plik skipped.txt zawierający pliki z błędem, aby można je było ręcznie sprawdzić i naprawić.

Jeśli to możliwe, należy sprawdzić stronę/program, który wygenerował nieprawidłowe pliki json, naprawić i ponownie wygenerować plik json. W przeciwnym razie będziesz mieć nowe pliki, które są nieprawidłowe JSON.

W przeciwnym razie należy utworzyć niestandardowy analizator składni json, który naprawia typowe błędy. Dzięki temu powinieneś umieścić oryginał pod kontrolą źródła (lub zarchiwizować), abyś mógł zobaczyć i sprawdzić różnice, które zautomatyzowane narzędzie naprawia (jako kontrolę poprawności). Niejednoznaczne przypadki należy ustalać ręcznie.

3

Tak, istnieją sposoby sprawdzenia poprawności pliku JSON. Jednym ze sposobów jest użycie biblioteki parsowania JSON, która wyświetli wyjątki, jeśli podane przez ciebie dane wejściowe nie są dobrze sformatowane.

try: 
    load_json_file(filename) 
except InvalidDataException: # or something 
    # oops guess it's not valid 

Oczywiście, jeśli chcesz to naprawić, to naturalnie nie można użyć ładowarka JSON, ponieważ dobrze, to nie jest ważne JSON w pierwszej kolejności. O ile biblioteka, z której korzystasz, automatycznie naprawi wszystko, w takim przypadku prawdopodobnie nie będziesz mieć nawet tego pytania.

Jednym ze sposobów jest załadowanie pliku ręcznie i tokenizowanie go oraz próba wykrycia błędów i próba ich usunięcia w trakcie pracy, ale jestem pewien, że są przypadki, w których błąd nie jest możliwy do naprawienia automatycznie i lepiej wyrzucić błąd i poprosić użytkownika o naprawienie swoich plików.

Nie napisałem sam program naprawy JSON, więc nie mogę podać żadnych szczegółów na temat naprawiania błędów.

Jednak nie jestem pewien, czy dobrze byłoby naprawić wszystkie błędy, ponieważ wtedy można by założyć, że poprawki są tym, czego faktycznie chce użytkownik. Jeśli jest to brakujący przecinek lub dodatkowy przecinek końcowy, może to być w porządku, ale mogą istnieć przypadki, w których niejednoznaczne jest to, czego chce użytkownik.

Powiązane problemy