如何用Python操作JSON数据库:删除值及同名对象更新
实现类JSON数据库的Python方案
首先修正你提供的JSON示例语法错误,合理的数据库结构可设计为包含多个对象的列表,每个对象包含name(你提到的“名称”)和object_id字段,示例如下:
{ "objects": [ {"name": "demo_obj", "object_id": 12345678} ] }
以下是满足你需求的具体实现:
1. 定义数据库类
import json import os class JSONDatabase: def __init__(self, file_path): self.file_path = file_path # 初始化数据库文件(不存在则创建空结构) if not os.path.exists(file_path): with open(file_path, 'w', encoding='utf-8') as f: json.dump({"objects": []}, f) self.load_data() def load_data(self): # 从文件加载数据 with open(self.file_path, 'r', encoding='utf-8') as f: self.data = json.load(f) def save_data(self): # 将数据写入文件持久化 with open(self.file_path, 'w', encoding='utf-8') as f: json.dump(self.data, f, indent=2) def update_or_add_object(self, name, object_id): # 查找名称匹配的对象,存在则更新,不存在则新增 for idx, obj in enumerate(self.data["objects"]): if obj["name"] == name: obj["object_id"] = object_id self.save_data() return f"已更新名称为'{name}'的对象,新object_id: {object_id}" self.data["objects"].append({"name": name, "object_id": object_id}) self.save_data() return f"已添加新对象:名称'{name}',object_id: {object_id}" def delete_object(self, name=None, object_id=None): # 支持按名称或object_id删除对象 if not name and not object_id: return "必须提供名称或object_id作为删除条件" initial_count = len(self.data["objects"]) # 过滤保留无需删除的对象 self.data["objects"] = [ obj for obj in self.data["objects"] if not (name and obj["name"] == name) and not (object_id and obj["object_id"] == object_id) ] if len(self.data["objects"]) == initial_count: return "未找到匹配的对象" self.save_data() return "已删除匹配的对象"
2. 使用示例
# 初始化数据库(文件不存在时自动创建) db = JSONDatabase("my_db.json") # 添加/更新对象 print(db.update_or_add_object("test_obj", 12345678)) # 首次执行:添加新对象 print(db.update_or_add_object("test_obj", 87654321)) # 再次执行:更新已有对象的object_id # 删除对象 print(db.delete_object(name="test_obj")) # 按名称删除 print(db.delete_object(object_id=87654321)) # 按object_id删除
关键功能说明
- 自动更新逻辑:
update_or_add_object方法遍历现有对象,匹配到相同名称则更新object_id,未匹配到则直接新增对象。 - 删除功能:支持按对象名称或
object_id两种条件删除,覆盖不同场景需求。 - 数据持久化:每次操作后自动将数据写入JSON文件,避免数据丢失。
如果你的JSON结构需要调整(比如以对象名称作为字典键),可修改核心方法逻辑,示例如下:
# 替代结构:{"objects": {"demo_obj": {"object_id": 12345678}}} def update_or_add_object(self, name, object_id): self.data["objects"][name] = {"object_id": object_id} self.save_data() return f"已更新/添加对象'{name}',object_id: {object_id}" def delete_object(self, name): if name in self.data["objects"]: del self.data["objects"][name] self.save_data() return "已删除对象" return "未找到对象"
内容的提问来源于stack exchange,提问作者Swampy
相关产品推荐
相关产品推荐

