【问题标题】:JSON is not saving in the right structure in pythonJSON没有保存在python中的正确结构中
【发布时间】:2021-12-21 07:09:19
【问题描述】:

我在 python 的课堂活动中遇到了一点问题。在这个活动中,我应该创建一个我应该为“小型商店”创建一个系统,以便能够注册产品(在 JSON 文件中),然后能够加载文件并使用相同的加载项进行查询。 基本上,这项工作已完成 90%,但我一直在试图弄清楚为什么我的产品记录没有保存在正确的 JSON 结构上。我不知道为什么 JSON 没有在记录前后保存带有“[]”的项目。

global estoque
global contador_sinal
global carregar_flag
estoque = []
lista_produtos = []   # <--- HERE I CREATE THE LIST THAT RECEIVES PRODUCT REGISTRATIONS
contador_sinal = 0
contador = 0
carregar_flag = 0

class Produto: # <-- CREATING THE CLASS OF PRODUCTS
    def __init__(self, codigo, nome, descricao, valor):
        self.codigo = codigo
        self.nome = nome
        self.descricao = descricao
        self.valor = valor

def gravar(): # <-- AND THIS IS THE FUNCTION THAT SAVES THE LIST PRODUCTS IN JSON
    global contador_sinal
    print("="*50)
    print(" ","\nGravando Arquivo Externo dos Produtos...")
    with open('data.json', 'w') as fp:
        for item in lista_produtos:
            if type(item) == Produto:
                json.dump(item.__dict__, fp, indent=4)    
                fp.write("\n")
            elif type(item) == dict:
                json.dump(item, fp, indent=4)    
    time.sleep(1)
    print(" ")
    print("\033[32mARQUIVO SALVO COM SUCESSO!\033[0m\n")
    fp.close()

    contador_sinal = 1
    
    return menu()

以下是保存后信息在 JSON 上的显示方式:

{
    "codigo": 1,
    "nome": "test1",
    "descricao": "description",
    "valor": 10.0
}
{
    "codigo": 2,
    "nome": "test2",
    "descricao": "description",
    "valor": 20.0
}
{
    "codigo": 3,
    "nome": "test3",
    "descricao": "description",
    "valor": 30.0
}

如果有人知道如何修复这个结构以及保存错误的原因,那将是一个巨大的帮助。

【问题讨论】:

  • 简单地 json.dump lista_produtos 列表本身和 write a serializer 用于 Produto。就目前而言,您的代码正在转储单个项目,这会导致 JSON 无效。
  • 全局范围内的global 语句没有做任何有用的事情。
  • 对于此处的问题,创建minimal reproducible example 也很有用。作为新用户,也可以使用tour 并阅读How to Ask

标签: python json python-3.x


【解决方案1】:

不可能有有效的 JSON,追加更多数据并获得仍然有效的 JSON。这就是在循环中分别保存每个 dict(JSON 中的对象)的问题。

有几种方法可以绕过它:

  1. 在内存中创建一个字典列表并将其保存为 JSON 一次。

  2. 只是为了完整性,因为它是一个 hack。在文件开头、分隔符和文件末尾分别添加[,]字符,以创建JSON列表。

  3. 我的建议:将文件格式从 JSON 更改为 newline delimited JSON。在发布的代码中,您需要更改的只是删除indent=4 参数。当然,读取此类文件的程序必须逐行读取并单独加载每个 JSON 行。那应该没问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 2021-08-23
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    相关资源
    最近更新 更多