Go 1.27 traz encoding/json/v2 e encoding/json/jsontext como APIs generalmente disponíveis
Aprofundamento CEVIU
Aprofundamento
Segundo o go.dev, o encoding/json/v2 e o encoding/json/jsontext saem do status experimental e ficam estáveis no Go 1.27. A motivação é que vários problemas do encoding/json (v1) são consequência da própria API e não dá para corrigi-los sem quebrar a promessa de compatibilidade do Go 1. Criar nomes como MarshalV2 seria, nas palavras do texto, um namespace paralelo dentro do mesmo pacote. Daí o caminho do v2.
O jsontext cuida só da sintaxe (Encoder, Decoder, Value e Token, sem reflection e com streaming de verdade). O json/v2 cuida da semântica, a relação entre valores JSON e valores Go. As interfaces novas MarshalerTo e UnmarshalerFrom operam direto sobre Encoder e Decoder, o que permite repassar opções pela pilha de chamadas e evita o parse duplo que o UnmarshalJSON exige. Os padrões mudam: UTF-8 inválido e nomes duplicados viram erro, slices e maps nil saem como array e objeto vazios, o casamento de campos passa a diferenciar maiúsculas de minúsculas, e omitempty é redefinido. Serializar time.Duration também gera erro, com opções para o chamador decidir. Sobre desempenho, o Marshal fica em paridade com o v1 e o Unmarshal chega a ser até 10x mais rápido em benchmarks. O texto cita ganhos de ordens de grandeza no kube-openapi do Kubernetes ao trocar para UnmarshalJSONFrom, e promete mais melhorias no Go 1.28.
Por que isso importa
Para quem mantém APIs em Go, a migração tende a ser mais de revisar comportamentos padrão do que de reescrever código, já que a fonte diz que usos do v1 devem funcionar quase igual no v2. O ponto de atenção é o contrato com clientes: nil virando [] e campos case-sensitive podem alterar respostas e entradas aceitas. Quem tem tipos com MarshalJSON e UnmarshalJSON próprios ganha mais ao implementar as variantes To e From.
Linha do tempo
CEVIU noticia que o Go 1.27 traria pacotes SIMD experimentais.
Go 1.27 torna encoding/json/v2 e encoding/json/jsontext generalmente disponíveis.
Perguntas frequentes
O encoding/json v1 vai deixar de existir?
A fonte não fala em remoção. O v1 segue sob a promessa de compatibilidade do Go 1, e o v2 é um pacote separado, em encoding/json/v2. Quem não migrar continua usando o v1.
O que muda no comportamento padrão do v2?
O v2 dá erro com UTF-8 inválido e com nomes de objeto duplicados. Slices e maps nil viram array e objeto vazios. O casamento de nomes de campo passa a ser case-sensitive, e omitempty omite valores que seriam null, "", [] ou {}.
O v2 é mais rápido que o v1?
No Unmarshal, sim, com benchmarks de até 10x. No Marshal, o desempenho é próximo, às vezes um pouco melhor e às vezes um pouco pior. Para ganhar mais, os tipos devem implementar MarshalerTo e UnmarshalerFrom.
Para que serve o pacote jsontext?
Ele processa JSON no nível da sintaxe, com Encoder, Decoder, Value e Token, sem depender de reflection. É a base sobre a qual o json/v2 foi construído e permite processamento em streaming.
Fontes
- go.devfonte original
- Categoria
- CEVIU Web Dev
- Publicado
- 05 de novembro de 2026
- Editoria
- CEVIU Web Dev

