У меня есть окно с вкладками, в котором я прошу пользователей ввести некоторые данные, а затем нажать кнопку, которая обновляет представление списка и добавляет новые данные в конец файла JSON, но я не могу понять, как добавить данные в квадратных скобках [], чтобы сделать его действительным JSON, поэтому я хочу:
[
{
"store": "My Store",
"address": "123 Anywhere Calgary, Ab",
"category": "Grocery",
"item": "Ground Coffee",
"qty": "1",
"price": "10.99",
"GST": false,
"PST": false,
"EHC": "0.",
"deposit": "0.",
"other": "0."
},
{
"store": "My Store",
"address": "123 Anywhere Calgary, Ab",
"category": "Grocery",
"item": "Flour, All Purp",
"qty": "1",
"price": "9.99",
"GST": false,
"PST": false,
"EHC": "0.",
"deposit": "0.",
"other": "0."
},
{
"store": "My Store",
"address": "123 Anywhere Calgary, Ab",
"category": "Grocery",
"item": "Taco Shells",
"qty": "1",
"price": "4.59",
"GST": false,
"PST": false,
"EHC": "0.",
"deposit": "0.",
"other": "0."
},
{
"store": "My Store",
"address": "123 Anywhere Calgary, Ab",
"category": "Grocery",
"item": "BBQ Sauce",
"qty": "1",
"price": "3.79",
"GST": false,
"PST": false,
"EHC": "0.",
"deposit": "0.",
"other": "0."
},
{
"store": "My Store",
"address": "123 Anywhere Calgary, Ab",
"category": "Grocery",
"item": "Ritz Bits",
"qty": "1",
"price": "3.49",
"GST": false,
"PST": false,
"EHC": "0.",
"deposit": "0.",
"other": "0."
}
]
Это подтверждается как правильный формат JSON, но при добавлении в файл я получаю следующее:
[
{
"store": "My Store",
"address": "123 Anywhere Calgary, Ab",
"category": "Grocery",
"item": "Ground Coffee",
"qty": "1",
"price": "10.99",
"GST": false,
"PST": false,
"EHC": "0.",
"deposit": "0.",
"other": "0."
}
]
[
{
"store": "My Store",
"address": "123 Anywhere Calgary, Ab",
"category": "Grocery",
"item": "Flour, All Purp",
"qty": "1",
"price": "9.99",
"GST": false,
"PST": false,
"EHC": "0.",
"deposit": "0.",
"other": "0."
}
]
Поскольку каждый добавленный элемент заключен в квадратные скобки [], он больше не является допустимым JSON. Итак, как я могу добавить элементы между [и], чтобы JSON оставался действительным? Есть ли способ добавить элементы, затем перейти к началу файла и вставить [, затем перейти в конец файла и добавить]?
Проблема в том, что пользователь может добавлять продукты в файл JSON в любое время, когда они хотят, поскольку я технически использую JSON в качестве «базы данных». Когда пользователь запускает программу, я хочу иметь возможность перечитать данные JSON и заполнить элемент управления списком предыдущими записями.
Или мне стоит поискать другой метод хранения данных?
Спасибо!






with open("my_file.json","rb") as f:
existing = json.load(f)
existing.append(item)
with open("my_file.json","wb") as f:
json.dump(existing,f)
или еще лучше абстрагироваться
class JSONList(object):
def __init__(self,fname):
self.fname = fname
self.items = []
self.load()
def save():
with open(self.fname,"wb") as f:
json.dump(self.items,f)
def load(self):
try:
self.items = json.load(open(self.fname,"rb"))
except: # bad form empty except... but whatever
self.items = []
def append(self,new_item,save=True):
self.items.append(new_item)
if save:
self.save()
конечно, много правды во всем этом ... наследование от встроенных функций, таких как list и str, иногда может быть шатким ... поэтому я пытался сохранить его как минимум минимальным
Еще лучше, включите промежуточный шаг для резервного копирования текущей версии файла и восстановления ее в случае сбоя операции записи. Кроме того, вы можете сделать это, унаследовав
listвместоobject, что даст вам более полезные методы сбора в дополнение к отсутствию необходимости отслеживать сами элементы (просто используйтеsuper().append(...)).