Принуждение json к дампу объекта json, даже если список пуст

У меня есть список, который может быть пустым или непустым.

Я хочу создать новый файл, который содержит этот список в формате, который легко читается и легко для моего следующего script для синтаксического анализа. В случае, когда список не пуст, это работает отлично, и мой следующий script читает в json файле. Но когда список пуст, я получаю "ValueError: объект JSON не может быть расшифрован". Это имеет смысл, потому что, когда я открываю файл, на самом деле нет содержимого и, следовательно, нет объекта JSON.

Я в порядке с тем, что некоторые списки пустые. Таким образом, либо я хочу написать пустой объект JSON, либо я хочу, чтобы мой читатель script был в порядке, не обнаружив объект JSON.

Вот соответствующий код:

Writer Script

favColor = []   OR   favColor = ['blue']   OR favColor = ['blue', 'green']
fileName = 'favoriteColor.json'
outFile = open(fileName, 'w')
json.dump(outFile, favColor)
outFile.close()

Reader Script

fileName = 'favoriteColor.json'
inFile = open(fileName, 'r')
colors = json.load(inFile)
inFile.close()

Любая помощь или предложения очень ценится. Если мне нужно больше объяснить, почему я это делаю, я могу это и представить, просто подумал, что начну с минимума, необходимого для понимания проблемы.

Ответ 1

Измените читателя script следующим образом:

with open('favoriteColor.json') as inFile:
    try: 
         colors = json.load(inFile)
    except ValueError: 
         colors = []

Это попытка загрузить файл как json. Если это ошибка из-за ошибки значения, мы знаем, что это потому, что json пуст. Поэтому мы можем просто назначить цвета для пустого списка. Также предпочтительно использовать конструкцию "с" для загрузки файлов, так как она автоматически закрывает их.

Ответ 2

Я бы не стал использовать тот подход, который вы пытаетесь. Вместо этого я бы использовал json.dump словарь, например:

d = {'var1': '123', 'var2': [1, 2, 3]}
json.dump(d, fileout)

Затем используйте dict.get, чтобы он по умолчанию соответствовал значению:

json_dict = json.load(filein)
favColor = json_dict.get('favColor', [])

Затем у вас все еще есть обязательные значения, которые могут быть исключены, если не присутствуют с использованием обозначения [].

Заставляет логику отсутствующих значений в вашем коде вместо json-парсеров...

Ответ 3

Вы также можете добавить имя переменной в свой json файл:

json.dump({'favorite-color': favColor}, outFile)
outFile.close()

И обрабатывайте случай с пустым списком при чтении json файла:

data = json.load(inFile)

if len(data['favorite-color']) == 0:
    ...

Обратите внимание, что вы должны предоставить объект, который вы хотите сохранить, а затем файл-подобный объект json.dump.