Go 1.27: JSON v2 больше не требует экспериментального флага
В Go 1.25 появился экспериментальный encoding/json/v2. Чтобы попробовать его, нужно было включить GOEXPERIMENT=jsonv2. В Go 1.27 экспериментальный этап закончился: теперь v2 доступен без флага, прямо из стандартной библиотеки. Вместе с ним появился и низкоуровневый пакет encoding/json/jsontext. Как использовать Больше не нужно менять переменные окружения: import "encoding/json/v2" func main() { data, err := json.Marshal(map[string]int{ "answer": 42, }) if err != nil { panic(err) } fmt.Println(string(data)) } У v2 знакомые Marshal и Unmarshal, но появились и дополнительные варианты API, например MarshalWrite для записи напрямую в io.Writer и UnmarshalRead для чтения из io.Reader. Зачем вообще понадобился новый пакет? Старый encoding/json давно используется повсюду, поэтому менять его поведение напрямую было рискованно. V2 позволяет пересмотреть API и некоторые значения по умолчанию, не ломая совместимость старого интерфейса. Например, v2 по умолчанию: возвращает ошибку при некорректном UTF-8 в JSON-строках; возвращает ошибку, если в JSON-объекте повторяются имена полей; при маршалинге nil-слайс превращает в [], а не null; при разборе JSON в структуру использует чувствительное к регистру сопоставление имён. Это не просто косметические отличия. Если API уже работает с клиентами, изменение null на [] или более строгая проверка входного JSON могут повлиять на совместимость. А что со старым encoding/json? Он остаётся в стандартной библиотеке, и миграция не обязательна. При этом внутри Go 1.27 старый encoding/json теперь опирается на реализацию v2, сохраняя прежнее поведение API. Точные тексты некоторых ошибок могут отличаться. Если возникнут проблемы совместимости, старую реализацию можно временно вернуть при сборке через GOEXPERIMENT=nojsonv2. Что по производительности? По данным релизных заметок, маршалинг в целом примерно на уровне прежней реализации, а анмаршалинг заметно быстрее. Но это не значит, что замена импорта автоматически ускорит любое приложение: стоит проверить на своих данных и сценариях. Итого: Go 1.27 сделал JSON v2 обычной частью стандартной библиотеки. Можно начинать изучать новый API без экспериментальных флагов, но перед миграцией существующего сервиса важно проверить различия в поведении и покрыть их тестами. Официальные материалы: https://go.dev/doc/go1.27, https://go.dev/doc/jsonv2-migration