← На главную

Go 1.27 получил стабильный API encoding/json/v2

04.11.2026 17:52 · hackernews

Команда Go объявила, что пакеты encoding/json/v2 и encoding/json/jsontext стали стабильными и общедоступными в Go 1.27. Работа над новой версией заняла около шести лет и прошла через экспериментальный выпуск в Go 1.25. Изменить прежний encoding/json напрямую было практически невозможно: обещание совместимости Go 1 закрепляло не только интерфейс, но и ряд ошибочных или неудобных особенностей.

Старая реализация принимает недопустимый UTF-8 и повторяющиеся имена полей, сериализует nil-срезы и отображения как null, а при разборе сопоставляет поля без учёта регистра. Это может приводить к неоднозначной интерпретации данных и проблемам безопасности. Кроме того, параметры Encoder и Decoder нельзя передать через обычные Marshal и Unmarshal, а интерфейсы MarshalJSON и UnmarshalJSON вынуждают выделять буферы, повторно разбирать значения и хранить их целиком.

Новый jsontext отделяет синтаксическую обработку JSON от преобразования значений в типы Go. Он не использует reflection и предоставляет действительно потоковые Encoder и Decoder для отдельных токенов и значений. Поверх него encoding/json/v2 предлагает привычные Marshal и Unmarshal с параметрами, а также MarshalWrite, UnmarshalRead, MarshalEncode и UnmarshalDecode. Пользовательские типы могут реализовать MarshalJSONTo и UnmarshalJSONFrom, а вызывающая сторона способна задавать собственные функции сериализации для произвольных типов.

По умолчанию v2 сообщает об ошибках при недопустимом UTF-8 и повторных именах, превращает nil-срезы и отображения в пустые массивы и объекты и сопоставляет поля с учётом регистра. Изменился смысл omitempty, а time.Duration без выбранного представления теперь вызывает ошибку. Для большинства отличий предусмотрены параметры, возвращающие поведение v1.

Производительность Marshal в целом осталась близкой к прежней, а Unmarshal в тестах ускорился до десяти раз. Наибольший выигрыш ожидается при переходе пользовательских реализаций на потоковые интерфейсы; в Kubernetes это устранило квадратичный рост затрат при рекурсивном разборе OpenAPI.

Поддерживать v1 обещают бессрочно. Более того, v1 теперь реализован через v2 с набором параметров совместимости, поэтому библиотеки могут переходить постепенно и продолжать работать друг с другом. Дополнительные оптимизации ожидаются в Go 1.28.

Читать оригинал →