2012-08-02 83 views
11

我有一个列表,它可能是空的或非空的。强制json转储json对象,即使列表为空

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

我很确定有些列表是空的。所以,要么写一个空的JSON对象,要么我的阅读器脚本没有找到JSON对象就OK。

下面是相关代码:

作家脚本

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() 

任何帮助或建议非常赞赏。如果我需要提供更多理由来解释为什么我这样做,我也可以提供这一点,只是认为我会以最低限度的必要条件开始理解问题。

回答

15

修改你的读者的脚本是:

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

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

+0

不错,很干净+1 – 2012-08-02 15:51:38

+0

非常感谢,非常感谢,并解释了为什么“以open()as ...”为首选。我曾经听过人们说过这是最好的选择,但没有理由,它永远不会让我改变。 – rcorty 2012-08-02 16:38:01

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解析器...

2

你也可以在你的JSON文件中添加变量名:

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

和处理的情况下读取JSON文件时,一个空的列表:

data = json.load(inFile) 

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

请注意,您必须提供您想要的类文件对象保存,然后json.dump对象。