Аналитический отчёт

Go 1.27: encoding/json/v2 и jsontext стали стабильными

Новые JSON-пакеты, впервые выпущенные как эксперимент годом ранее, устраняют давние проблемы корректности, безопасности и производительности encoding/json.

INSIGHTEX Editorial Desk

2 мин чтения

Go 1.27: encoding/json/v2 и jsontext стали стабильнымиАналитический отчёт

Что произошло

С выходом Go 1.27 пакет encoding/json/v2 и сопутствующий ему encoding/json/jsontext получили стабильный статус и открыты для общего использования, сообщили в Go. У публикации от 4 ноября 2026 года семь авторов, среди которых Joe Tsai, Damien Neil, Daniel Martí и Michael Pratt. Она следует за экспериментальной версией API, представленной в предыдущем году и доработанной после дополнительной обратной связи.

По словам авторов, исходный пакет encoding/json оказался гибким, но имеет недостатки, на которые пользователи указывали на протяжении многих лет. Он допускает некорректный UTF-8, что запрещено RFC 8259. Он также принимает объекты с повторяющимися именами членов, и этой слабостью злоумышленники пользовались ранее, например в CVE-2017-12635. Кроме того, он сопоставляет имена полей без учёта регистра и кодирует nil-срезы и словари как null.

Как говорится в публикации, исправить такое поведение, не нарушив обещание совместимости Go 1, было невозможно. То же относится к ограничениям производительности, таким как буферизация целых значений в памяти и квадратичное замедление, когда пользовательские методы рекурсивно вызывают Marshal или Unmarshal. Новая архитектура делит работу на две части: jsontext обрабатывает синтаксис JSON без использования рефлексии, а json/v2 сопоставляет значения JSON с типами Go.

Контекст

Поддержка JSON входит в стандартную библиотеку Go ещё со времён до выхода Go 1.0, и авторы называют JSON самым распространённым форматом данных в интернете. Поскольку проблемы вытекают из самого существующего API, они выбрали отдельное пространство имён v2, а не добавление параллельных функций вроде MarshalV2 в исходный пакет. Опрос, упомянутый в публикации, показал, что большинство пользователей Go хотят, чтобы nil-срезы и словари кодировались как пустые массивы или объекты.

ИсточникGo

Обзор

Неделя в технологиях в одном письме.

Материалы, которые стоят вашего времени, каждую неделю. Отписаться можно в любой момент.