Preço virando texto e CPF sem o zero: o que o json do Python não guarda e o jsonW guarda
O módulo json do Python aceita NaN, ignora nome repetido e obriga a decodificar a linha inteira. Em Python, o jsonW guarda o tipo de negócio no esquema e lê um campo sem decodificar o resto, com números medidos no README do projeto.

O Datasette Agent ganhou, em 3 de novembro de 2026, um painel que conversa ao lado das páginas de banco de dados, e a versão 0.3a0 do Datasette Apps, lançada em 4 de novembro, passou a deixar o agente criar e alterar aplicações sobre os dados por conversa. As duas notas estão no blog do criador do Datasette, Simon Willison, e apontam o mesmo movimento: cada vez mais gente lê e monta coisa em cima do dado que já existe, sem escrever um sistema inteiro. Para quem decide tecnologia, isso empurra a pergunta para trás do painel: o dado que esse painel vai ler está guardado num formato que entrega o valor certo sem conversão no meio.
O que muda na prática para quem tem dados em produção
Em Python, o caminho mais comum é ler um arquivo com o módulo json da biblioteca padrão e transformar cada linha num dicionário. Funciona para protótipo e trava quando o dado é de negócio. A própria documentação do Python (versão 3.15.2) lista três comportamentos que surpreendem quem vem de uma planilha ou de um banco: valores infinitos e NaN são aceitos e devolvidos por padrão, ainda que não sejam JSON válido; nomes repetidos dentro de um objeto são aceitos, e o módulo guarda só o último valor; e o carregamento obriga a decodificar a linha inteira para chegar a um campo.
Os três casos aparecem no dia a dia. O preço que voltou como texto, o CPF que perdeu o zero da frente, o peso que ninguém sabe se era grama ou quilo e o campo duplicado que sobrescreveu o anterior são as perdas clássicas de quem converte dado para JSON no meio do caminho. Nenhuma delas dá erro: o programa segue, o relatório sai e o erro aparece semanas depois no caixa.
Na prática, a decisão de tecnologia muda em três pontos. O primeiro é o tipo do valor: guardar dinheiro como número de ponto flutuante é uma escolha que a linguagem aceita e que a contabilidade não aceita. O segundo é o acesso: abrir 100 mil linhas para ler um campo é caro em memória, em CPU e em tempo de resposta. O terceiro é a permissão: se o filtro de quem vê o quê fica no código da aplicação, cada novo relatório é uma chance nova de vazar dado.
O que o jsonW faz nesse caminho
O jsonW é um modelo de dados da Wortic com três formas que se convertem sem perda: linha para eventos e tempo real, coluna no arquivo .jsw para lote e histórico, e texto para gente ler e escrever. Todo JSON válido já é jsonW-texto válido. O SDK de Python fica em sdk/python/jsonw.py, é um arquivo só, não tem dependência além da biblioteca padrão e fala com a ABI C do núcleo.
Quem implementa o acesso em Python enxerga duas classes, jsonw.Leitor e jsonw.Escritor. O Escritor recebe o caminho e o esquema. O Leitor expõe linhas, esquema, campos, json(i), texto(i), campo(i, nome_ou_indice), conferir() e avaliar(pedido, k). O acesso ao campo é direto: o leitor vai à posição sem decodificar o resto da linha, porque o arquivo é guardado em colunas.
import jsonw
with jsonw.Escritor("vendas.jsw", "id:i64,produto:texto,preco:dinheiro") as w:
w.gravar({"id": 1, "produto": "Café especial", "preco": "12,50 BRL"})
with jsonw.Leitor("vendas.jsw") as r:
print(r.campo(0, "preco")) # acesso direto, sem decodificar o resto
r.conferir()
O esquema é uma linha de texto. No exemplo, id é inteiro de 64 bits, produto é texto e preco é do tipo dinheiro, que guarda a moeda em cada valor no padrão ISO 4217. O valor entra como o cliente escreve, com vírgula ou ponto, e é guardado exato: o README registra que a entrada aceita 1.234,56 e 1,234.56, e que a saída canônica usa ponto.
Os tipos que resolvem o problema na origem
A lista de tipos do jsonW foi montada em cima dos casos que o JSON não distingue. Dinheiro com moeda é dinheiro. Valor exato sem moeda é decimal[2], com a escala entre colchetes. Peso, volume, energia, distância e carbono são medida[unidade], e a entrada em outra unidade da mesma grandeza é convertida ao gravar. CNPJ, CPF, chave, placa, SKU e CEP são codigo, guardados byte a byte, então o zero da frente nunca some. Data e hora são tempo, em microssegundos UTC. Texto que se repete muito, como cidade, status e categoria, é dic, guardado uma vez por arquivo.
O esquema também carrega a permissão. Colunas marcadas com +pessoal ou +escopo(financeiro) saem nulas quando a sessão não tem aquele escopo, e uma coluna tenant restringe as linhas ao cliente da credencial. A checagem acontece no servidor, antes de responder, e não no código de cada relatório.
Números: o que o README mede e o que ele não mede
O README do projeto traz dois números, medidos com 100 mil registros contra o mesmo conjunto em JSONL lido pelo próprio leitor de JSON do projeto: o arquivo fica 4,9 vezes menor e a leitura de um campo é 3.281 vezes mais rápida. O próprio README avisa que bibliotecas de JSON mais otimizadas diminuem a diferença ao gravar e ler tudo, e que a vantagem do acesso direto vem do formato em colunas. Ele indica o comando wjsw medir para repetir a medição na máquina de quem decide.
O README não publica números de consumo de memória por leitor, de custo de servidor nem de rede para o caso do Python. A economia que se pode afirmar com a fonte é a de disco no arquivo e a de tempo no acesso a campo. Qualquer estimativa de conta de nuvem a partir disso seria conta de quem escreve, não do projeto.
Sobre memória, o README descreve um comportamento de projeto, não um número: o arquivo é lido por mmap compartilhado entre processos e o acesso direto busca a posição sem carregar o resto. O ganho de recursos vem daí, e precisa ser medido no volume real de cada operação antes de entrar numa proposta.
Comparação honesta com o que se usa hoje
| Hoje | O que resolve bem | Onde custa | O que o jsonW muda |
|---|---|---|---|
Módulo json do Python | Protótipo, API pequena, arquivo de configuração | Sem tipo de negócio, aceita NaN e nome repetido, decodifica a linha inteira | Tipo no esquema, acesso direto ao campo, custódia por hash |
| CSV | Troca simples com o time de negócio | Perde o tipo e o zero à esquerda; a vírgula depende do locale | Tipo guardado no arquivo, saída sem depender de locale |
| Parquet | Coluna comprimida para análise | Exige motor de leitura por trás e não traz permissão no arquivo | SDK leve em 10 linguagens e permissão no esquema |
| Banco de vetores | Busca por significado em escala | Mais um serviço para operar | Busca por significado dentro do próprio arquivo |
| Camada de permissão no código | Controle fino por aplicação | Cada nova consulta pode trazer mais do que devia | Visão aplicada no servidor, antes de responder |
O jsonW não substitui o banco que já está em produção. O wcon tira os dados do banco para um .jsw e devolve do .jsw para o banco, ida e volta sem perda, e o esquema sai do próprio banco, pelo tipo de cada coluna. O PostgreSQL, o MySQL, o SQLite, o Redis e o MongoDB estão na lista de origem e destino.
O fluxo em um gráfico
flowchart LR
A["JSONL ou banco"] --> B["wcon ou wjsw de-texto"]
B --> C["arquivo .jsw em colunas"]
C --> D["jsonw.Leitor em Python"]
D --> E["campo da linha, sem decodificar o resto"]
D --> F["visão por credencial"]
F ->> G["coluna +pessoal sai nula"]
F ->> H["linha de outro tenant não abre"]
C --> I["wjsw conferir: sha256 e crc32c"]
Três exemplos do dia a dia de quem decide
1. O relatório de vendas que não pode arredondar. Situação: o time de dados exporta as vendas do PostgreSQL para JSON e monta o relatório em Python com o módulo json; o preço aparece como número de ponto flutuante e a soma não fecha com o extrato. O que fazer: exportar com wcon pg para um .jsw com a coluna de preço em dinheiro ou decimal[2], e ler com jsonw.Leitor pedindo só as colunas do relatório. Resultado esperado: o valor sai com a moeda e a escala originais, sem passar por ponto flutuante, e o relatório fecha com o extrato.
2. O arquivo de cadastro que perdeu o zero. Situação: a base de clientes foi para CSV, o CPF virou número e os CNPJs que começam com zero vieram truncados. O que fazer: declarar esses campos como codigo no esquema e gravar de novo a partir da origem; o jsonW guarda byte a byte. Resultado esperado: o identificador sai igual ao que entrou, sem normalização, e a conferência com a origem fica igual, célula a célula.
3. O painel que mostrou o dado do cliente errado. Situação: o time monta um painel de leitura sobre o dado e a consulta de um cliente traz a linha de outro. O que fazer: incluir a coluna tenant no esquema e entregar a credencial assinada ao leitor, para que a visão seja aplicada no servidor antes de responder. Resultado esperado: só as linhas do tenant da credencial saem, e as colunas marcadas como pessoais ou de escopo financeiro aparecem nulas sem o escopo.
Como a Wortic ajuda
A Wortic mantém o jsonW e roda nele o índice dos seus agentes, os seus modelos de IA e a borda da sua infraestrutura. O formato, o site e a documentação estão em jsonw.org, o código e os SDKs em github.com/developer-wortic/jsonw, e o pacote do Node.js em npmjs.com/package/@wortictecnologia/jsonw. Para o time de Python, o caminho de entrada é o arquivo sdk/python/jsonw.py, com a biblioteca compilada da plataforma, sem instalar dependência além da biblioteca padrão.
O passo a passo para testar numa tarde: baixar o repositório; gerar o primeiro .jsw com wjsw de-texto a partir de um JSONL de amostra, com o esquema escrito à mão; ler o arquivo com jsonw.Leitor e pedir um campo; rodar wjsw conferir para ver a custódia; e repetir a medição com wjsw medir no volume real da operação antes de decidir.
Perguntas e respostas
O jsonW para Python precisa instalar alguma coisa?
Não precisa de dependência: o SDK é um arquivo, sdk/python/jsonw.py, que fala com a biblioteca do núcleo pela ABI C. É preciso ter a biblioteca compilada da plataforma ao lado do arquivo, como o README indica.
Dá para trocar o módulo json por jsonW sem reescrever o sistema?
A troca é gradual. O jsonW guarda em .jsw e lê pelo jsonw.Leitor, e o README mostra a ida e volta para JSON por wjsw para-texto --json, sem perda. Na prática, comece pelos conjuntos em que o tipo e o acesso a campo importam.
O jsonW guarda dinheiro como número de ponto flutuante?
Não. O tipo dinheiro guarda o valor com a moeda ISO 4217 em cada valor e o tipo decimal[2] guarda valor exato sem passar por ponto flutuante. O README diz que o 12,50 continua 12,50.
Como leio um campo sem carregar o arquivo inteiro em memória?
Com jsonw.Leitor, o método campo(i, nome) vai à posição sem decodificar o resto da linha. O README explica que o formato em colunas permite leitura paralela por bloco e mmap compartilhado entre processos.
O jsonW é mais rápido que o pandas para ler dados?
O README não compara com o pandas e não publica esse número. Os números medidos são contra o JSONL lido pelo próprio leitor de JSON do projeto, com 100 mil registros. A recomendação do README é medir na máquina de quem decide, com wjsw medir.
Dá para esconder o CPF de quem acessa o arquivo?
Sim, pelo esquema. A coluna marcada com +pessoal sai nula quando a sessão não tem o escopo, e a regra é aplicada no servidor antes de responder, como descreve o README.
O jsonW substitui o PostgreSQL da empresa?
Não. Ele convive com os bancos que já existem: o wcon leva dados do banco para um .jsw e traz de volta, com o esquema tirado do próprio banco, e o README trata isso como ida e volta sem perda.
Posso usar o jsonW sem pagar licença?
A licença de uso sustentável permite uso gratuito dentro do seu produto, em quantos servidores quiser. Ela não permite revender o jsonW como serviço nem fazer engenharia reversa do núcleo, e a documentação pode ser lida, citada e usada. A Wortic pode ser procurada em wortic.com.br para outros casos.
Fontes
- README do jsonW, do repositório developer-wortic/jsonw.
- AGENTS.md do jsonW, com as regras de esquema, tipos e comandos.
- sdk/python/jsonw.py, o SDK de Python do jsonW.
- jsonw.org, o site do jsonW.
- json, JSON encoder and decoder, documentação do Python 3.15.2, sobre NaN, nomes repetidos e limites de implementação.
- Release: datasette-agent 0.5a0, Simon Willison, 3 de novembro de 2026.
- Release: datasette-apps 0.3a0, Simon Willison, 4 de novembro de 2026.
Perguntas frequentes
O jsonW para Python precisa instalar alguma coisa?
Não precisa de dependência além da biblioteca padrão: o SDK é o arquivo sdk/python/jsonw.py, que fala com a biblioteca do núcleo do jsonW pela ABI C. É preciso ter a biblioteca compilada da plataforma ao lado do arquivo, como o README do projeto indica.
Dá para trocar o módulo json por jsonW sem reescrever o sistema?
A troca é gradual. O jsonW grava em arquivo .jsw e lê pelo jsonw.Leitor, e o README mostra a volta para JSON com wjsw para-texto --json, sem perda. O caminho mais direto é começar pelos conjuntos em que tipo de dado e acesso a campo importam.
O jsonW guarda dinheiro como número de ponto flutuante?
Não. O tipo dinheiro guarda o valor com a moeda ISO 4217 em cada valor, e o tipo decimal[2] guarda valor exato sem passar por ponto flutuante. Segundo o README do jsonW, 12,50 continua 12,50.
Como ler um campo de uma linha sem carregar o arquivo inteiro?
Com jsonw.Leitor, o método campo(i, nome) vai direto à posição do campo sem decodificar o resto da linha, porque o arquivo .jsw é guardado em colunas. O README do jsonW descreve ainda leitura paralela por bloco e mmap compartilhado entre processos.
O jsonW é mais rápido que o pandas para ler dados?
O README do jsonW não compara com o pandas e não publica esse número. Os valores divulgados são a comparação com o JSONL lido pelo próprio leitor de JSON do projeto, com 100 mil registros: arquivo 4,9 vezes menor e leitura de um campo 3.281 vezes mais rápida. A orientação do README é medir na própria máquina com o comando wjsw medir.
Dá para esconder o CPF de quem acessa o arquivo de dados?
Sim, pelo esquema. Uma coluna marcada com +pessoal sai nula quando a sessão não tem o escopo, e a regra é aplicada no servidor antes de responder. É o que o README do jsonW chama de visão por permissão.
O jsonW substitui o PostgreSQL da empresa?
Não. O jsonW convive com os bancos que já existem: a ferramenta wcon leva dados do PostgreSQL, MySQL, SQLite, Redis ou MongoDB para um arquivo .jsw e devolve do .jsw para o banco, com o esquema tirado do próprio banco. A Wortic mantém o jsonW e pode ser procurada pelo site wortic.com.br.
Posso usar o jsonW sem pagar licença?
A licença de uso sustentável permite uso gratuito dentro do próprio produto, em quantos servidores quiser. Ela não permite revender o jsonW como serviço nem fazer engenharia reversa do núcleo. A documentação pode ser lida, citada e usada, e o projeto está em jsonw.org.
Fontes
- README do jsonW (GitHub)
- AGENTS.md do jsonW (GitHub)
- SDK de Python do jsonW (sdk/python/jsonw.py)
- jsonw.org
- json, JSON encoder and decoder (Python 3.15.2)
- Release: datasette-agent 0.5a0 (Simon Willison, 03/11/2026)
- Release: datasette-apps 0.3a0 (Simon Willison, 04/11/2026)
Conheça: jsonW em Python.
Quer isso funcionando na sua empresa?
Um consultor da Wortic olha o seu caso e mostra o caminho, sem compromisso.
Falar com um consultorEquipe editorial
Equipe editorial da Wortic especializada em automacao, IA, ERP, CRM e crescimento operacional.
- Automacao com IA
- Gestao empresarial
- CRM
- ERP
- Marketing digital


