Python: проверка и форматирование файлов JSON

У меня около 2000 файлов JSON, которые я пытаюсь запустить через программу Python. Проблема возникает, когда файл JSON находится не в правильном формате. (Ошибка: ValueError: No JSON object could be decoded ) В свою очередь, я не могу прочитать его в своей программе.

В настоящее время я делаю что-то вроде ниже:

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

Я знаю, что есть автономные методы для проверки и форматирования файлов JSON, но есть ли программный способ проверки и форматирования этих файлов? Если нет, есть ли бесплатная / дешевая альтернатива для фиксации всех этих файлов в автономном режиме, т.е. я просто запускаю программу в папке, содержащей все файлы JSON, и форматирует их по мере необходимости?


SOLVED, используя комментарий @ reece:

 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) 

Оказывается, я сохраняю файл, который не находится в формате JSON в моем рабочем каталоге, который был тем же местом, откуда я читал данные. Спасибо за полезные предложения.

2 Solutions collect form web for “Python: проверка и форматирование файлов JSON”

Встроенный модуль JSON может использоваться как валидатор:

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

Вы можете заставить его работать с файлами, используя:

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

вместо json.loads и вы также можете json.loads имя файла в сообщении об ошибке.

В Python 3.3.5 для {test: "foo"} я получаю:

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

и на 2.7.6:

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

Это связано с тем, что правильный json является {"test": "foo"} .

При обработке недопустимых файлов лучше не обрабатывать их дальше. Вы можете создать файл skipped.txt, в котором перечислены файлы с ошибкой, поэтому их можно проверить и зафиксировать вручную.

Если возможно, вы должны проверить сайт / программу, которая сгенерировала недопустимые json-файлы, исправить это, а затем повторно сгенерировать json-файл. В противном случае вы будете продолжать иметь новые файлы, которые недействительны JSON.

В противном случае вам нужно будет написать собственный json-парсер, который исправляет распространенные ошибки. При этом вы должны помещать оригинал под контроль источника (или архивироваться), чтобы вы могли видеть и проверять различия, которые исправляется автоматическим инструментом (как проверка работоспособности). Неоднозначные случаи следует фиксировать вручную.

Да, есть способы проверить, что файл JSON действителен. Один из способов – использовать библиотеку синтаксического анализа JSON, которая будет генерировать исключения, если предоставленный вами ввод не будет хорошо отформатирован.

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

Конечно, если вы хотите исправить это, вы, естественно, не можете использовать загрузчик JSON, так как, во-первых, он недействителен JSON. Если библиотека, которую вы используете, автоматически исправит для вас вещи, и в этом случае у вас, вероятно, даже не возникнет такой вопрос.

Один из способов – загрузить файл вручную и сделать его токенизирующим, а также попытаться обнаружить ошибки и попытаться исправить их, когда вы идете, но я уверен, что есть случаи, когда ошибка просто невозможна для исправления автоматически, и было бы лучше сбрасывать и попросить пользователя исправить свои файлы.

Я сам не написал JSON-фиксатор, поэтому я не могу представить никаких подробностей о том, как вы можете исправить ошибки.

Однако я не уверен, было бы хорошей идеей исправить все ошибки, так как тогда вы бы предположили, что ваши исправления – это то, что действительно хочет пользователь. Если это недостающая запятая или у них есть дополнительная запятая, то это может быть хорошо, но могут быть случаи, когда это неоднозначно, чего хочет пользователь.

  • Какой модуль JSON можно использовать в Python 2.5?
  • Python json.loads ValueError, ожидающий разделитель
  • Как вернуть сообщения об ошибках в JSON с помощью Bottle HTTPError?
  • Исключить пустые / нулевые значения из сериализации JSON
  • Как автоматически исправить недопустимую строку JSON?
  • Могу ли я использовать данные JSON для добавления новых объектов в Django?
  • Какая структура Python для веб-службы REST / JSON без интерфейса?
  • Преобразование строки даты JSON в дату и время Python
  • Python - лучший язык программирования в мире.