Pular para o conteúdo
Tecnologia

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.

Por Equipe Wortic 15 min de leitura
Preço virando texto e CPF sem o zero: o que o json do Python não guarda e o jsonW guarda

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

HojeO que resolve bemOnde custaO que o jsonW muda
Módulo json do PythonProtótipo, API pequena, arquivo de configuraçãoSem tipo de negócio, aceita NaN e nome repetido, decodifica a linha inteiraTipo no esquema, acesso direto ao campo, custódia por hash
CSVTroca simples com o time de negócioPerde o tipo e o zero à esquerda; a vírgula depende do localeTipo guardado no arquivo, saída sem depender de locale
ParquetColuna comprimida para análiseExige motor de leitura por trás e não traz permissão no arquivoSDK leve em 10 linguagens e permissão no esquema
Banco de vetoresBusca por significado em escalaMais um serviço para operarBusca por significado dentro do próprio arquivo
Camada de permissão no códigoControle fino por aplicaçãoCada nova consulta pode trazer mais do que deviaVisã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

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

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 consultor

Equipe editorial

Equipe editorial da Wortic especializada em automacao, IA, ERP, CRM e crescimento operacional.

  • Automacao com IA
  • Gestao empresarial
  • CRM
  • ERP
  • Marketing digital

Isso funcionando no seu negócio.

Um consultor mostra o sistema do seu ramo, com a IA dentro.