Após anos de planejamento e prototipagem na biblioteca padrão, a equipe de engenharia da linguagem Go anunciou a estabilização e disponibilidade geral dos pacotes encoding/json/v2 e encoding/json/jsontext com o lançamento do Go 1.27.

Anúncio oficial no blog do Go apresentando o encerramento da fase experimental e a introdução da v2 na biblioteca padrão. Fonte: Go Dev.

Correções estruturais e conformidade com a RFC 8259

O pacote original encoding/json operava desde antes do Go 1.0 e acumulava comportamentos históricos que causavam inconsistências ou vulnerabilidades de segurança:

  • Sintaxe e validação estrita: a v2 rejeita por padrão sequências de bytes com UTF-8 inválido e objetos com nomes de membros duplicados — um vetor conhecido de falhas de segurança entre diferentes analisadores (como no CVE-2017-12635).
  • Sensibilidade a maiúsculas e minúsculas: o processo de desserialização agora adota correspondência exata de campos por padrão, eliminando ambiguidades e melhorando o rendimento do decodificador.
  • Tratamento de nulos: slices e maps com valor nil passam a ser serializados como arrays ([]) e objetos vazios ({}) por padrão, prevenindo falhas de integração em ecossistemas que não aceitam null.
  • Arquitetura modular: a camada sintática de baixo nível foi separada em encoding/json/jsontext, fornecendo primitivas de streaming com alocação zero de memória e suporte a JSON compacto ou indentado personalizável.

A versão clássica encoding/json continuará suportada no Go para garantir compatibilidade retroativa absoluta. A documentação completa e exemplos práticos de migração estão disponíveis no anúncio oficial no Go Blog.