Como salvar vários clientes corretamente em um arquivo JSON no Python?

0
5
Asked By LumiNox42 On

Estou aprendendo Python e tentando criar um cadastro de clientes sem usar soluções prontas. O programa salva os dados em um arquivo JSON, mas, quando cadastro um novo cliente, ele acaba colocando dois dicionários um ao lado do outro, algo como `}{`, em vez de manter um JSON válido e bem formatado. Também gostaria que cada chave aparecesse em sua própria linha. Como devo estruturar os dados e salvar o arquivo para que os clientes não sejam juntados dessa forma?

2 Answers

Answered By CedarFox7 On

Use o módulo `json` com o parâmetro `indent` para deixar o conteúdo formatado. O ponto mais importante é não gravar cada dicionário diretamente no arquivo em sequência. JSON não permite dois objetos independentes colados como `}{`; coloque os clientes dentro de uma lista, leia os registros existentes, acrescente o novo e grave a lista inteira novamente. Por exemplo: `import json

novo_cliente = {"name": "usuário 2", "cpf": "6616"}

try:
with open("clientes.json", "r", encoding="utf-8") as arquivo:
clientes = json.load(arquivo)
except (FileNotFoundError, json.JSONDecodeError):
clientes = []

clientes.append(novo_cliente)

with open("clientes.json", "w", encoding="utf-8") as arquivo:
json.dump(clientes, arquivo, ensure_ascii=False, indent=4)`

MentaCloud18 -

A estrutura final ficará parecida com `[ { "name": "usuário 1", "cpf": "616" }, { "name": "usuário 2", "cpf": "6616" } ]`. O `indent=4` cuida das quebras e da indentação; não é necessário inserir manualmente `n` entre as chaves.

Answered By PixelHarbor53 On

Se você quiser manter um objeto em vez de uma lista, pode usar uma chave que contenha todos os clientes, por exemplo `{ "clientes": [ ... ] }`. Ainda assim, é preciso carregar o JSON completo com `json.load()`, adicionar o novo dicionário à lista e salvar tudo com `json.dump(..., indent=4)`. Escrever vários dicionários consecutivamente no mesmo arquivo sempre produzirá um formato inválido, porque o arquivo termina com dois objetos colados.

Related Questions

LEAVE A REPLY

Please enter your comment!
Please enter your name here

This site uses Akismet to reduce spam. Learn how your comment data is processed.