Ir al contenido
jueves, 5 de noviembre de 202623°Dólar Oficial $1.570Dólar Blue $1.560Dólar MEP $1.589Dólar Tarjeta $2.041
PicoTecno

Go incorpora encoding/json/v2 para corregir fallas de su paquete JSON

Según go.dev, las nuevas versiones v2 y jsontext del paquete para JSON ya son estables y llegarán con Go 1.27. Buscan corregir comportamientos riesgosos y limitaciones de rendimiento de la versión actual.

Redacción PicoTecno

· Actualizada 5 de noviembre de 2026 a las 10:54

Go incorpora encoding/json/v2 para corregir fallas de su paquete JSON
(go.dev)

Según informó go.dev, los paquetes encoding/json/v2 y encoding/json/jsontext ya son estables y estarán disponibles de forma general en Go 1.27. Se trata de una nueva API para JSON (JavaScript Object Notation, un formato liviano de intercambio de datos muy usado en internet) que reemplaza, en lo que respecta a sus mejoras, al paquete actual encoding/json. La biblioteca estándar de Go incluye soporte para JSON desde antes de la versión 1.0 del lenguaje.

El equipo de Go había presentado el año pasado una versión experimental de esta API. Tras recibir devoluciones de los usuarios y ajustar el diseño, el proyecto decidió avanzar con su publicación. Según la nota, el paquete actual demostró ser flexible, pero con los años se acumularon problemas que los usuarios fueron detectando.

Problemas de comportamiento y de seguridad

Entre las fallas de comportamiento, la fuente señala que encoding/json acepta texto UTF-8 inválido, cuando el estándar vigente de Internet (RFC 8259) exige UTF-8 válido. Esto puede provocar corrupción silenciosa de datos. También admite objetos con nombres de miembros duplicados, un caso que el estándar deja sin definir y que ya fue aprovechado en un fallo de seguridad identificado como CVE-2017-12635.

Otro punto es el tratamiento de slices y mapas nulos. Hoy se serializan como null de JSON, lo que puede generar errores en otras implementaciones que no aceptan null donde se espera un arreglo u objeto. Un relevamiento citado en la fuente indica que la mayoría de los usuarios de Go preferiría que se serialicen como arreglo u objeto vacío por defecto. Además, la asociación entre nombres de miembros y campos de struct se hace sin distinguir mayúsculas y minúsculas, algo que la fuente califica como un comportamiento sorpresivo, una posible vulnerabilidad y una limitación de rendimiento.

Limitaciones de la API y del rendimiento

En cuanto a la interfaz, la fuente indica que resulta difícil decodificar correctamente desde un io.Reader, ya que el uso habitual no rechaza datos sobrantes al final de la entrada. Las opciones configurables en los tipos Encoder y Decoder tampoco funcionan con las funciones Marshal y Unmarshal, ni pueden propagarse a métodos personalizados, lo que hace que, por ejemplo, la opción DisallowUnknownFields pierda efecto al llamar a un UnmarshalJSON propio.

También hay costos de rendimiento. Los métodos MarshalJSON y UnmarshalJSON obligan a reservar memoria para cada resultado y a validar y reformatear datos, y en el caso de la decodificación el valor debe analizarse dos veces. Según el texto, la biblioteca tampoco transmite datos en streaming: almacena el valor JSON completo en memoria. Si estos métodos llaman recursivamente a las funciones de serialización, el costo crece de forma cuadrática.

¿Por qué no corregir todo en el paquete existente? La fuente explica que introducir una versión mayor incompatible es una decisión costosa y que muchos de estos problemas son consecuencias directas de la API actual, por lo que son prácticamente imposibles de arreglar sin romper la promesa de compatibilidad de Go 1. Crear funciones con nombres alternativos dentro del mismo paquete tampoco resultaba razonable, por lo que se optó por un espacio de nombres separado, encoding/json/v2.

Como base de estas mejoras, el nuevo paquete jsontext trabaja únicamente con la sintaxis de JSON, sin depender de la reflexión de Go, y opera en modo streaming. Su nombre hace referencia a la gramática de JSON definida en la sección 2 de RFC 8259. Con él se busca separar con claridad la codificación sintáctica de la asignación de significado semántico, que es lo que hace el paquete v2 en la capa superior.

Compartí esta nota

Seguí leyendo