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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 10:06:02