我有这种将json数据写入文件的方法。标题基于书籍,数据是书籍的出版者,日期,作者等。如果我要添加一本书,该方法可以正常工作。
代码
import json
def createJson(title,firstName,lastName,date,pageCount,publisher):
print "\n*** Inside createJson method for " + title + "***\n";
data = {}
data[title] = []
data[title].append({
'firstName:', firstName,
'lastName:', lastName,
'date:', date,
'pageCount:', pageCount,
'publisher:', publisher
})
with open('data.json','a') as outfile:
json.dump(data,outfile , default = set_default)
def set_default(obj):
if isinstance(obj,set):
return list(obj)
if __name__ == '__main__':
createJson("stephen-king-it","stephen","king","1971","233","Viking Press")
带有一本书/一个方法调用的JSON文件
{
"stephen-king-it": [
["pageCount:233", "publisher:Viking Press", "firstName:stephen", "date:1971", "lastName:king"]
]
}
但是,如果我多次调用该方法,则会向json文件中添加更多图书数据。格式完全错误。例如,如果我仅使用主方法
两次调用该方法 if __name__ == '__main__':
createJson("stephen-king-it","stephen","king","1971","233","Viking Press")
createJson("william-golding-lord of the flies","william","golding","1944","134","Penguin Books")
我的JSON文件看起来像
{
"stephen-king-it": [
["pageCount:233", "publisher:Viking Press", "firstName:stephen", "date:1971", "lastName:king"]
]
} {
"william-golding-lord of the flies": [
["pageCount:134", "publisher:Penguin Books", "firstName:william","lastName:golding", "date:1944"]
]
}
这显然是错误的。是否有一个简单的修复方法可以编辑我的方法以生成正确的JSON格式?我在网上看到许多简单的示例,这些示例将json数据放入python。但是当我检查JSONLint.com时,所有这些都给了我格式错误。我一直在竭尽全力解决此问题,并编辑文件以使其正确。但是我所有的努力都没有用。任何帮助表示赞赏。非常感谢你。
答案 0 :(得分:0)
仅将新对象附加到文件不会创建有效的JSON。您需要将新数据添加到顶级对象中,然后重写整个文件。
这应该有效:
def createJson(title,firstName,lastName,date,pageCount,publisher):
print "\n*** Inside createJson method for " + title + "***\n";
# Load any existing json data,
# or create an empty object if the file is not found,
# or is empty
try:
with open('data.json') as infile:
data = json.load(infile)
except FileNotFoundError:
data = {}
if not data:
data = {}
data[title] = []
data[title].append({
'firstName:', firstName,
'lastName:', lastName,
'date:', date,
'pageCount:', pageCount,
'publisher:', publisher
})
with open('data.json','w') as outfile:
json.dump(data,outfile , default = set_default)
答案 1 :(得分:0)
JSON可以是数组或字典。在您的情况下,JSON有两个对象,一个带有键stephen-king-it
,另一个带有william-golding-lord of the flies
。单独使用这些都可以,但是组合它们的方式无效。
使用数组可以执行以下操作:
[
{ "stephen-king-it": [] },
{ "william-golding-lord of the flies": [] }
]
或者是字典样式格式(我会推荐这样做):
{
"stephen-king-it": [],
"william-golding-lord of the flies": []
}
此外,您要附加的数据看起来应该被格式化为字典中的键值对(这是理想的)。您需要将其更改为此:
data[title].append({
'firstName': firstName,
'lastName': lastName,
'date': date,
'pageCount': pageCount,
'publisher': publisher
})