Код Python для загрузки данных из какого-то длинного сложного файла JSON:
with open(filename, "r") as f:
data = json.loads(f.read())
(примечание: лучшая версия кода должна быть:
with open(filename, "r") as f:
data = json.load(f)
но оба демонстрируют похожее поведение)
Для многих типов ошибок JSON (отсутствующие разделители, неправильные обратные косые черты в строках и т. Д.) Выводится приятное полезное сообщение, содержащее номер строки и столбца, в которых была обнаружена ошибка JSON.
Однако для других типов ошибок JSON (включая классическое «использование запятой в последнем элементе списка», а также другие вещи, такие как использование заглавных букв true / false), вывод Python просто:
Traceback (most recent call last):
File "myfile.py", line 8, in myfunction
config = json.loads(f.read())
File "c:\python27\lib\json\__init__.py", line 326, in loads
return _default_decoder.decode(s)
File "c:\python27\lib\json\decoder.py", line 360, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "c:\python27\lib\json\decoder.py", line 378, in raw_decode
raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded
Для этого типа ValueError, как заставить Python сообщать вам, где ошибка в файле JSON?
json.load(f)
вместоjson.loads(f.read())
Ответы:
Я обнаружил, что
simplejson
модуль дает больше описательных ошибок во многих случаях, когда встроенныйjson
модуль нечеткий. Например, в случае наличия запятой после последнего элемента в списке:что не очень наглядно. Та же операция с
simplejson
:Намного лучше! То же самое и для других распространенных ошибок, таких как использование заглавных букв
True
.источник
json
библиотека stdlib была обновлена и дает новый формат сообщения об ошибке. Однако сейчас у меня нет времени отслеживать точные релизы.Вы не сможете заставить python сообщать вам, где неверен JSON. Вам нужно будет использовать линтер онлайн где-то вроде этого
Это покажет вам ошибку в JSON, который вы пытаетесь декодировать.
источник
Вы можете попробовать библиотеку rson, найденную здесь: http://code.google.com/p/rson/ . Я также на PYPI: https://pypi.python.org/pypi/rson/0.9, так что вы можете использовать easy_install или pip, чтобы получить его.
для примера, данного томом:
RSON разработан как надмножество JSON, поэтому он может анализировать файлы JSON. Она также имеет альтернативный синтаксис , который намного лучше для людей , чтобы посмотреть и редактировать. Я довольно часто использую его для входных файлов.
Что касается использования булевых значений с заглавной буквы: похоже, что rson читает неправильно написанные логические значения как строки.
источник
У меня была аналогичная проблема из-за одиночных цитат. В стандарте JSON ( http://json.org ) говорится только об использовании двойных кавычек, поэтому
json
библиотека python должна поддерживать только двойные кавычки.источник
Для моей конкретной версии этой проблемы я пошел дальше и поискал объявление функции
load_json_file(path)
вpackaging.py
файле, а затем ввел в негоprint
строку:Таким образом, он будет печатать содержимое json-файла перед входом в try-catch, и таким образом - даже с моими едва существующими знаниями Python - я смог быстро понять, почему моя конфигурация не могла прочитать json-файл.
(Это потому, что я настроил свой текстовый редактор для написания спецификации UTF-8… глупо)
Просто упомяну об этом, потому что, хотя это, возможно, не лучший ответ на конкретную проблему OP, это был довольно быстрый метод определения источника очень тяжелой ошибки. И я уверен, что многие люди, которые ищут более подробное решение для файла
MalformedJsonFileError: No JSON object could be decoded when reading …
. Так что это может им помочь.источник
with open(fn) as f
), он обрабатывает закрытие файла в исключении для вас. en.wikibooks.org/wiki/Python_Programming/…Что касается меня, мой файл json очень большой, при использовании обычного
json
в python он получает указанную выше ошибку.После установки с
simplejson
помощьюsudo pip install simplejson
.И тогда я решил это.
источник
У меня была аналогичная проблема, это был мой код:
проблема была в том, что я забыл
file.close()
я сделал это и исправил проблему.источник
with open(fn) as f
), он обрабатывает закрытие файла в исключении для вас. en.wikibooks.org/wiki/Python_Programming/…Принятый ответ - самый простой способ решить проблему. Но в случае, если вам не разрешено устанавливать simplejson из-за политики вашей компании, я предлагаю ниже решение, чтобы исправить конкретную проблему «использования запятой в последнем элементе списка» :
Создайте дочерний класс «JSONLintCheck» для наследования от класса «JSONDecoder» и переопределите метод инициализации класса «JSONDecoder», как показано ниже:
источник
Просто нажмите ту же проблему, и в моем случае проблема была связана с
BOM
(меткой порядка байтов) в начале файла.json.tool
откажется обрабатывать даже пустой файл (только фигурные скобки), пока я не удалю отметку UTF BOM.Я сделал следующее:
set nobomb
)Это решило проблему с json.tool. Надеюсь это поможет!
источник
Когда ваш файл будет создан. Вместо создания файл с пустым содержимым. Заменить:
источник
Вы можете использовать cjson , который утверждает, что он работает до 250 раз быстрее, чем реализация на чистом Python, учитывая, что у вас есть «какой-то длинный сложный файл JSON», и вам, вероятно, придется запускать его несколько раз (декодеры не работают и сообщают о первой ошибке, которую они только встреча).
источник