面向对象餐厅订单管理系统员工信息JSON更新功能实现求助
问题描述
我正在开发一款面向对象的餐厅订单管理系统,已拆分出Employee和CreateFile两个独立模块:
Employee类负责封装员工信息(emp_id、姓名、phone_num、role)并转为字典;CreateFile类处理JSON文件的创建、保存、加载与更新,用于存储Employee实例的字典数据,比如Employee(4245, "John", "Smith", "07956", "waiter")会被转为字典存入JSON文件。
目前已实现数据加载与保存,但更新功能存在问题:希望传入任意Employee实例,加载JSON数据后找到对应字典完成更新。尝试过加载JSON为字典列表,遍历匹配emp_id的方式,但实现复杂且未达预期效果。
现有代码
Json_loading.py(CreateFile类)
import os import json class CreateFile: def __init__(self, data, file_name, key="", value=""): self.data = data self.file_name = file_name self.key = key self.value = value def create_file(self, data, file_name): info_to_write = json.dumps(data) + "\n" json_file = file_name if os.path.exists(json_file): with open(json_file, "a") as file: file.write(info_to_write) else: with open(json_file, "w") as file: file.write(info_to_write) def update_file(self, key, update_value, file_name, instance): loaded_data = self.load(file_name) for dicts in loaded_data: if dicts.get("emp_id") == instance.get_id(): dicts[key] = update_value with open(file_name, 'w') as file: json.dump(loaded_data, file, indent=4) def load(self, file_name): with open(file_name, 'r') as file: content = file.read() data = json.loads(content) return data
Employee.py(Employee类)
from Json_loading import CreateFile class Employee: def __init__(self, emp_id, first_name, last_name, phone_num, role): self.emp_id = emp_id self.first_name = first_name self.last_name = last_name self.phone_num = phone_num self.role = role self.loader = CreateFile({}, "employee_data.json") def add_employee(self): # should i use kwarggs? emp_dict = { "emp_id": self.emp_id, "first_name": self.first_name, "last_name": self.last_name, "phone_num": self.phone_num, "role": self.role } self.loader.create_file(emp_dict, "employee_data.json") def update_employee(self, key, new_value, file_name, instance): self.loader.update_file(key, new_value, file_name, instance) def get_info(self): return self.loader.load("employee_data.json")
现有方案的核心问题
- JSON文件格式不合法:
create_file每次追加单独的JSON对象(带换行),但load用json.loads()解析整个文件——多个独立JSON对象无法被解析为合法JSON结构,直接报错。 - 方法缺失导致运行错误:
update_file调用instance.get_id(),但Employee类未实现该方法,会抛出AttributeError。 - 职责划分混乱:
CreateFile的__init__参数冗余,data/key/value未在方法中使用;Employee的update_employee需要传入instance,但当前实例本身已包含emp_id,完全多余;create_file命名错误,实际是追加数据而非创建文件,逻辑混淆。
- 更新逻辑无容错性:因文件格式错误,
load方法无法正确读取数据,后续遍历匹配自然失效。
优化实现思路
1. 统一JSON文件格式
用JSON数组存储所有员工数据,确保加载和写入都是标准合法格式,避免解析错误。
2. 梳理类职责
JsonFileHandler(原CreateFile)作为通用工具类,仅负责JSON文件的增删改查,不绑定具体业务实例;Employee类专注于员工数据封装,调用工具类完成持久化,简化接口参数。
3. 实现高效更新逻辑
以emp_id为唯一标识,遍历列表匹配后直接更新字段,更新完成后重新写入整个数组。
优化后代码
Json_loading.py
import os import json class JsonFileHandler: """通用JSON文件操作工具类""" def __init__(self, file_name): self.file_name = file_name # 初始化空文件为JSON数组 if not os.path.exists(self.file_name): with open(self.file_name, 'w') as f: json.dump([], f) def load_data(self): """加载文件数据,返回列表""" with open(self.file_name, 'r') as f: try: return json.load(f) except json.JSONDecodeError: # 修复损坏的文件 with open(self.file_name, 'w') as f_reset: json.dump([], f_reset) return [] def append_data(self, data): """追加单条数据到文件""" all_data = self.load_data() all_data.append(data) with open(self.file_name, 'w') as f: json.dump(all_data, f, indent=4) def update_data_by_id(self, id_key, id_value, update_fields): """根据唯一ID更新数据 :param id_key: 唯一标识键名(如"emp_id") :param id_value: 匹配的ID值 :param update_fields: 更新字段字典 :return: 是否更新成功 """ all_data = self.load_data() updated = False for item in all_data: if item.get(id_key) == id_value: item.update(update_fields) updated = True break if updated: with open(self.file_name, 'w') as f: json.dump(all_data, f, indent=4) return updated
Employee.py
from Json_loading import JsonFileHandler class Employee: """员工信息封装类""" def __init__(self, emp_id, first_name, last_name, phone_num, role): self.emp_id = emp_id self.first_name = first_name self.last_name = last_name self.phone_num = phone_num self.role = role self.data_handler = JsonFileHandler("employee_data.json") def to_dict(self): """实例转字典""" return { "emp_id": self.emp_id, "first_name": self.first_name, "last_name": self.last_name, "phone_num": self.phone_num, "role": self.role } def save(self): """保存当前员工到文件""" self.data_handler.append_data(self.to_dict()) def update(self, **kwargs): """更新员工字段并同步到文件 示例: emp.update(phone_num="123456", role="manager") """ # 更新实例自身属性 for key, value in kwargs.items(): if hasattr(self, key): setattr(self, key, value) # 同步更新文件 return self.data_handler.update_data_by_id( id_key="emp_id", id_value=self.emp_id, update_fields=kwargs ) @classmethod def get_all_employees(cls): """获取所有员工数据""" handler = JsonFileHandler("employee_data.json") return handler.load_data()
使用示例
# 创建并保存员工 emp = Employee(4245, "John", "Smith", "07956", "waiter") emp.save() # 更新员工信息 success = emp.update(phone_num="12345678", role="senior waiter") print(f"更新成功: {success}") # 获取所有员工 all_emps = Employee.get_all_employees() print(all_emps)
内容的提问来源于stack exchange,提问作者NeedsToKnow
相关产品推荐
相关产品推荐

