Python开发小店商品管理系统时JSON存储缺少[]结构异常求助
问题原因
当前gravar函数采用循环遍历lista_produtos的逻辑,对每个元素单独调用json.dump写入文件。json.dump每次只会输出单个合法JSON结构,不会自动为多个对象添加外层数组包裹,因此最终输出的是多个独立JSON对象拼接的内容,不符合JSON数组规范。
修复方法
无需循环逐个写入,先将所有商品统一转换为字典格式的列表,再一次性调用json.dump写入整个列表即可,修改后的gravar函数代码如下:
import json import time # 原代码用到time.sleep,需提前导入对应库 def gravar(): # <-- 修改后的商品存储函数 global contador_sinal print("="*50) print(" ","\nGravando Arquivo Externo dos Produtos...") # 先把所有商品统一转为字典列表 json_data = [] for item in lista_produtos: if isinstance(item, Produto): json_data.append(item.__dict__) elif isinstance(item, dict): json_data.append(item) # 一次性写入整个列表到JSON文件 with open('data.json', 'w', encoding='utf-8') as fp: json.dump(json_data, fp, indent=4, ensure_ascii=False) time.sleep(1) print(" ") print("\033[32mARQUIVO SALVO COM SUCESSO!\033[0m\n") # with语法会自动关闭文件,无需手动调用fp.close() contador_sinal = 1 return menu()
补充说明
- 修改后生成的JSON会自动在外层包裹
[],每个商品对象作为数组元素,完全符合JSON规范,后续读取时直接调用json.load即可直接拿到完整商品列表 - 用
isinstance做类型判断比直接对比type更严谨,支持子类场景判断,是Python官方推荐的类型校验写法 - 添加
encoding='utf-8'和ensure_ascii=False参数可避免中文商品名、描述出现乱码问题
内容的提问来源于stack exchange,提问作者Kaio Pablo
相关产品推荐
相关产品推荐

