2.28. JSON¶
JSON (JavaScript Object Notation) é um formato de texto compacto e legível por humanos para dados estruturados. Ele define seis tipos – string, number, boolean, null, array e object – cada um dos quais mapeia diretamente para um valor Python, de modo que converter entre Python e JSON é uma única chamada de função em qualquer direção.
JSON é a língua franca de arquivos de configuração e APIs web. Recorra a ele sempre que precisar salvar um pequeno conjunto de configurações em disco em uma forma que também possa ler a olho nu, ou trocar dados estruturados com outro programa.
Duas funções cobrem a maioria das necessidades:
json.dumps()– dump string: transforma um valor Python em uma string JSON.json.loads()– load string: analisa uma string JSON de volta para Python.
O par json.dump / json.load (sem o s) faz o mesmo trabalho, mas recebe um objeto de arquivo diretamente.
2.28.1. Codificação (dumps)¶
import json
config = {
"name": "OpenMV",
"width": 320,
"tags": ["red", "round"],
}
text = json.dumps(config)
print(text)
Saída:
{"name": "OpenMV", "width": 320, "tags": ["red", "round"]}
O mapeamento é:
Qualquer coisa fora desse conjunto (uma classe personalizada, um buffer bytes, um set) lança TypeError. Converta o valor primeiro.
Nota
O json.dumps() do CPython aceita um argumento indent para uma saída formatada de forma legível; o do MicroPython não. O único ajuste de formatação é separators, que controla o espaçamento em linha – passe (',', ':') para a forma mais compacta. Saída com várias linhas e recuo precisa ser produzida à mão, se necessário.
2.28.2. Decodificação (loads)¶
text = '{"name": "OpenMV", "width": 320}'
config = json.loads(text)
print(config["name"], config["width"])
Saída:
OpenMV 320
Objetos JSON viram dict, arrays viram list, e o resto mapeia de volta para seus equivalentes Python. JSON inválido lança ValueError.
2.28.3. Lendo e gravando arquivos¶
O par baseado em arquivo combina bem com with:
import json
with open("config.json") as f:
config = json.load(f)
config["width"] = 640
with open("config.json", "w") as f:
json.dump(config, f)
Trate o arquivo JSON como um registro completo – leia-o, modifique o valor Python, grave-o de volta. Tentar editar JSON no lugar dentro de um arquivo geralmente cria mais bugs do que evita.