19

我有一个列表,它可能是空的或非空的。

我想创建一个新文件,其中包含该列表的格式是人类可读且易于我的下一个脚本解析的。在列表非空的情况下,这可以正常工作,我的下一个脚本会读入 json 文件。但是当列表为空时,我得到“ValueError: No JSON object could be decoded”。这是有道理的,因为当我打开文件时,确实没有内容,因此也没有 JSON 对象。

我对某些列表为空的事实感到满意。所以,要么我想写一个空的 JSON 对象,要么我希望我的阅读器脚本没有找到 JSON 对象。

以下是相关代码:

作家脚本

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

阅读器脚本

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

非常感谢任何帮助或建议。如果我需要为我这样做的原因提供更多理由,我也可以提供,只是认为我会从理解问题所需的最低限度开始。

4

3 回答 3

23

将您的阅读器脚本修改为:

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

这会尝试将文件加载为 json。如果由于值错误而失败,我们知道这是因为 json 为空。因此,我们可以将颜色分配给一个空列表。最好使用“with”结构来加载文件,因为它会自动关闭它们。

于 2012-08-02T15:48:09.087 回答
4

我不会采取你正在尝试的方法。我会改为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', [])

然后你仍然有强制值,除非使用[]符号不存在。

Puts the logic of missing values in your code instead of the json parsers...

于 2012-08-02T15:56:36.430 回答
2

You can also add the name of the variable in your json file:

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

And handle the case of an empty list when reading the json file:

data = json.load(inFile)

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

Note that you must provide the object that you want to save and then the file-like object to json.dump.

于 2012-08-02T15:57:19.800 回答