Python中将字典保存到JSON文件报错及类属性引用疑问
问题解答
1. JSONDecodeError报错原因分析
你遇到的JSONDecodeError: Expecting value: line 1 column 1 (char 0),本质原因是reload方法读取的JSON文件内容为空或无效,而导致文件无效的核心问题是:你的save方法尝试直接序列化存储实例对象的__objects字典,而JSON无法直接序列化自定义Python类的实例。
具体逻辑链:
__objects字典中存储的是自定义类实例(比如BaseModel的实例),json.dump()仅能序列化Python基本数据类型(字符串、数字、列表、字典等),无法直接处理自定义对象。- 调用
save()方法时,json.dump(self.__objects, f)会抛出序列化错误,若代码未捕获该异常,文件会被w+模式截断为空(w+打开文件时会先清空原有内容),最终文件中无有效JSON内容。 - 后续执行
reload()时,虽然文件存在,但读取到空内容,json.load()无法解析空字符串,因此抛出该错误。
修复方案:
保存前需将__objects中的实例转换为可序列化的字典格式(通常模型类会实现to_dict()方法完成转换),再进行序列化:
def save(self): serializable_objects = {} for key, obj in self.__objects.items(): serializable_objects[key] = obj.to_dict() with open(self.__file_path, "w") as f: json.dump(serializable_objects, f)
同时,reload()方法读取后,需根据字典中的__class__字段找到对应类,将字典重新转换为实例对象。
2. 类属性引用:self vs 类名的选择
- 如果
__objects是类属性(属于类本身,所有实例共享):- 用类名访问(如
YourClass.__objects):能确保操作的是类级别的属性,不会被实例的同名属性覆盖。若某个实例误定义了同名实例属性self.__objects,类名访问可绕过实例属性,直接操作类属性。 - 用self访问:当实例未重写该属性时,会指向类属性;但如果实例自身赋值了
self.__objects,后续用self访问的就是实例自己的属性,而非类属性。
- 用类名访问(如
若你的设计是让__objects作为所有实例共享的存储容器,推荐用类名访问,避免因实例误操作导致类属性被覆盖。
内容的提问来源于stack exchange,提问作者Leuel Asfaw
相关产品推荐
相关产品推荐

