Go 1.27 trae nuevo paquete JSON que acelera el marshal en 1.5‑3x y el unmarshal en 1.5‑2.3x
El paquete encoding/json/v2 de Go 1.27 promete mejoras significativas en el rendimiento de serialización y deserialización JSON, aunque con diferencias según el tipo de datos y la API usada.

Go 1.27 incluye por defecto un nuevo paquete JSON, encoding/json/v2, que reemplaza al antiguo encoding/json en cuanto a rendimiento. El cambio no es un reemplazo directo: las nuevas API difieren en validación de Unicode y sensibilidad a mayúsculas, por lo que el API legacy sigue siendo usable sobre el nuevo motor mediante la bandera GOEXPERIMENT=nojsonv2.
Los tres escenarios disponibles son:
- json (legacy) – encoding/json construido con GOEXPERIMENT=nojsonv2, la implementación original.
- json (Go 1.27) – encoding/json de la versión 1.27, con la API v1 sobre el nuevo motor.
- json/v2 – encoding/json/v2, la nueva API.
Pruebas en documentos simdjson (twitter.json 632 kB, canada.json 2.25 MB, citm_catalog.json 1.73 MB) se realizaron en un Apple M4 Max y un Intel Xeon Gold 6548N, con GOMAXPROCS=1, midiendo la mediana de ocho ejecuciones.
Resultados de unmarshalling:
- Legacy API sobre el nuevo motor: 172 MB/s → 203 MB/s en twitter.json, 186 MB/s → 241 MB/s en citm_catalog.json, pero 128 MB/s → 106 MB/s en canada.json.
- json/v2 frente a la original: 1.5 × a 2.3 × más rápido.
- json/v2 frente a la legacy API de 1.27: 1.8 × a 2 × más rápido.
Resultados de marshalling:
- Legacy API sobre el nuevo motor: 198 MB/s → 374 MB/s en twitter.json.
- json/v2 frente a la original: 1.2 × a 3 × más rápido.
- json/v2 frente a la legacy API de 1.27: 1.0 × a 1.7 × más rápido.
Para estructuras tipadas, se midió una slice de 10 000 registros con un esquema fijo. En ese caso, el unmarshalling sigue siendo más rápido con json/v2, pero el marshalling vuelve a ser más eficiente con la implementación legacy de Go 1.27.
En resumen, simplemente actualizar a Go 1.27 mejora el marshalling sin cambios de código, mientras que usar encoding/json/v2 aporta mejoras sustanciales en el unmarshalling y, en algunos casos, en el marshalling, especialmente cuando se trabaja con datos genéricos (interface{}). El rendimiento depende de la carga de trabajo y de si se serializan estructuras tipadas o datos sin esquema.
El código de pruebas está disponible en el repositorio del autor para que se pueda reproducir y extender el benchmark.
