Go 1.27 lança API JSON estável que corrige falhas históricas
Go 1.27 estreia a API estável encoding/json/v2 e o núcleo sintático encoding/json/jsontext, corrigindo falhas históricas do pacote de JSON e elevando segurança, padrão e desempenho.

Tecnologia
Nova versão do Go aprimora segurança e desempenho com API JSON estável e correções importantes.
Leia também: OpenAI compra Pierre para turbinar Codex e acelerar Git
O Go 1.27 passa a trazer uma nova API estável para JSON, com os pacotes encoding/json/v2 e encoding/json/jsontext, que corrigem falhas históricas do antigo encoding/json e prometem mais segurança, conformidade com padrões e desempenho em aplicações que trocam dados pela internet.
Nova API corrige falhas históricas do JSON em Go
A mudança é assinada por desenvolvedores de peso da comunidade Go, como Michael Pratt, Joe Tsai, Daniel Martí, Johan Brandhorst-Satzkorn, Roger Peppe, Chris Hines e Damien Neil. Depois de um período como experimento, a equipe afirma que “a nova API encoding/json/v2 e encoding/json/jsontext está estável e disponível no Go 1.27”.
O objetivo é atacar limitações conhecidas do encoding/json original, que acompanha a linguagem há mais de 15 anos. Entre os problemas sanados estão a aceitação de UTF-8 inválido, o tratamento permissivo de nomes duplicados em objetos JSON, o vazamento de nil em slices e mapas, a correspondência case-insensitive na desserialização e inconsistências na chamada de métodos personalizados de marshaling.
Segundo a equipe do Go, “encoding/json atualmente aceita UTF-8 inválido, enquanto o padrão RFC 8259 exige UTF-8 válido. O comportamento padrão deveria reportar erro para evitar corrupção silenciosa”. Com a nova API, entradas com UTF-8 incorreto passam a ser rejeitadas por padrão, reduzindo o risco de dados corrompidos circularem entre serviços.
Mais segurança contra JSON ambíguo
Outra mudança central é o endurecimento no tratamento de objetos JSON com chaves repetidas, algo que há anos preocupa quem desenvolve sistemas críticos. “A presença de nomes duplicados em objetos JSON pode ser explorada por atacantes, como no CVE-2017-12635. O comportamento padrão deve rejeitar nomes duplicados”, destaca a equipe.
Na prática, isso significa que, a partir da nova API, objetos JSON ambíguos — em que uma mesma chave aparece mais de uma vez com valores diferentes — deixam de ser aceitos como entrada válida. O comportamento anterior podia levar dois sistemas a interpretar os mesmos dados de maneiras diferentes, abrindo brecha para ataques em APIs de autenticação, autorização e serviços expostos na internet.
Nil vira coleção vazia, não mais null
A forma como slices e mapas nulos são serializados também muda para refletir o que a própria equipe identificou como preferência da maioria dos usuários. “A maioria dos usuários Go prefere que slices e mapas nil sejam serializados como arrays ou objetos vazios, e não como null”, afirma o time responsável.
Em muitos cenários de integração, especialmente com clientes escritos em outras linguagens, receber null onde se espera um array ou objeto causa erros na desserialização. Ao padronizar slices e mapas nil como coleções vazias, a nova API tende a diminuir incompatibilidades entre serviços e a necessidade de tratamentos especiais de borda.
Case-insensitive deixa de ser padrão
A correspondência de nomes de campos de struct de forma case-insensitive, que era um dos traços mais peculiares do encoding/json original, deixa de ser a regra. A equipe classifica esse comportamento como “uma vulnerabilidade potencial e uma limitação de desempenho”.
Ao depender de comparação sem diferenciar maiúsculas e minúsculas, o código ficava mais lento e sujeito a colisões inesperadas entre campos. A nova API passa a privilegiar correspondência mais previsível, alinhada ao que outras bibliotecas modernas de JSON fazem, reduzindo surpresas e fechando brechas sutis em serviços sensíveis, como os de autenticação.
Chamadas consistentes e opções em toda a pilha
O Go 1.27 também reorganiza a forma como métodos personalizados de JSON são chamados. No pacote antigo, um detalhe de implementação fazia com que métodos MarshalJSON definidos em receivers ponteiros fossem invocados de forma inconsistente, um bug conhecido que não podia ser corrigido sem quebrar compatibilidade. A nova API resolve esse comportamento, estabelecendo regras estáveis para quem implementa serialização própria.
Outra queixa antiga era a dificuldade de plugar opções de configuração em toda a cadeia de marshaling e unmarshaling. Antes, algumas opções só podiam ser usadas em Encoder e Decoder, não nas funções Marshal e Unmarshal nem em tipos que implementavam interfaces de marshaling. Com a reformulação, essas opções passam a ser propagáveis de forma mais natural, o que facilita, por exemplo, aplicar a mesma política de rejeição de campos desconhecidos em estruturas aninhadas e métodos personalizados.
Como funciona o novo núcleo jsontext
A fundação técnica da mudança vem do pacote encoding/json/jsontext, que separa de forma clara a parte sintática da parte semântica do trabalho com JSON. Esse pacote lida apenas com texto JSON, sem usar reflexão, e oferece tipos para valores completos e tokens individuais, com suporte real a streaming.
Enquanto o encoding/json/v2 cuida da conversão entre dados Go e JSON (o lado semântico), o jsontext fica responsável por codificar e decodificar o fluxo de bytes em tokens e valores, seguindo de perto o padrão RFC 8259. Essa separação permite decodificadores mais estritos e eficientes, além de facilitar cenários avançados, como processamento incremental de grandes volumes de dados.
Uma das grandes mudanças de desempenho é a introdução de novos métodos de interface, como MarshalJSONTo e UnmarshalJSONFrom, que operam diretamente sobre um Encoder ou Decoder em modo de streaming. Com isso, quem implementa tipos customizados pode gerar e consumir JSON de forma incremental, sem precisar alocar buffers intermediários nem forçar o pacote a revalidar e reformatar tudo.
Entenda o contexto
JSON é o formato de dados dominante em APIs REST, microserviços e integrações web, e está presente na biblioteca padrão do Go desde antes da versão 1.0. Ao longo do tempo, o pacote encoding/json original se mostrou robusto e flexível, mas acumulou decisões difíceis de reverter por causa da promessa de compatibilidade da linguagem.
Tentativas de corrigir comportamentos problemáticos esbarravam no risco de quebrar projetos em produção. Por isso, a equipe de Go optou por criar um novo espaço de nomes, encoding/json/v2, em vez de empilhar versões dentro do mesmo pacote. O resultado é uma ruptura controlada: o código existente continua funcionando com o pacote antigo, enquanto novos projetos e bases que decidirem migrar passam a contar com regras mais estritas e uma API mais moderna.
Impacto para desenvolvedores e empresas
A chegada da nova API deve ser sentida primeiro por equipes que trabalham intensamente com JSON em serviços web: plataformas digitais, fintechs, provedores de nuvem e sistemas distribuídos que trafegam grandes volumes de dados sensíveis. A rejeição de UTF-8 inválido e de objetos com chaves duplicadas aumenta a segurança de endpoints expostos, reduzindo superfície de ataque em validações de entrada.
Ao mesmo tempo, a possibilidade de streaming real e interfaces otimizadas tende a trazer ganhos de desempenho em pipelines de dados e serviços que consomem ou produzem JSON em alta escala. A conformidade maior com o RFC 8259 melhora a interoperabilidade com clientes e servidores escritos em outras linguagens.
Para quem mantém código legado, a mudança não é automática. Projetos que dependem de comportamentos específicos do encoding/json antigo — como campos resolvidos por case-insensitive ou o uso de null para slices nil — precisarão de avaliação cuidadosa antes de migrar. A recomendação da própria equipe é uma adoção gradual, começando por módulos novos ou serviços menos críticos, enquanto bibliotecas e frameworks populares atualizam suas dependências para expor as novas capacidades.
Do ponto de vista da comunidade, a recepção é positiva. A nova API ataca diretamente dores que se arrastavam há anos, inclusive vulnerabilidades já exploradas, como a relacionada ao CVE-2017-12635. A expectativa é que, nos próximos meses, encoding/json/v2 e encoding/json/jsontext se tornem o padrão de fato para novos projetos em Go, consolidando a linguagem como opção ainda mais sólida para back-ends que exigem alta confiabilidade e aderência a padrões internacionais.


