用python编写JSON数据。格式

时间:2018-07-15 08:50:58

标签: python json

我有这种将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时,所有这些都给了我格式错误。我一直在竭尽全力解决此问题,并编辑文件以使其正确。但是我所有的努力都没有用。任何帮助表示赞赏。非常感谢你。

2 个答案:

答案 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
})