У меня есть этот метод, который записывает данные 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. Я ломал голову, чтобы решить эту проблему, и редактировал файл, чтобы исправить это. Однако все мои усилия были напрасны. Любая помощь приветствуется. Большое спасибо.






Простое добавление новых объектов в файл не создает действительный 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)
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
})