You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

面向对象餐厅订单管理系统员工信息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")

现有方案的核心问题

  1. JSON文件格式不合法:create_file每次追加单独的JSON对象(带换行),但load用json.loads()解析整个文件——多个独立JSON对象无法被解析为合法JSON结构,直接报错。
  2. 方法缺失导致运行错误:update_file调用instance.get_id(),但Employee类未实现该方法,会抛出AttributeError。
  3. 职责划分混乱:
    • CreateFile的__init__参数冗余,data/key/value未在方法中使用;
    • Employee的update_employee需要传入instance,但当前实例本身已包含emp_id,完全多余;
    • create_file命名错误,实际是追加数据而非创建文件,逻辑混淆。
  4. 更新逻辑无容错性:因文件格式错误,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 08:42:18