encoding/json
Тема дорожной карты · Golang
Пакет encoding/json — стандартная библиотека Go для сериализации Go-значений в JSON и десериализации JSON обратно в Go-значения; он используется практически в каждом Golang веб-сервисе или API. json.Marshal(v) кодирует любое Go-значение — структуру, словарь, слайс или примитив — в []byte с JSON, а json.Unmarshal(data, &v) декодирует JSON-байты в Go-значение; теги полей структур вроде `json:"name,omitempty"` управляют именами ключей, пропуском нулевых значений и кодированием строк. Для потоковой обработки больших нагрузок json.NewEncoder(w).Encode(v) записывает напрямую в io.Writer, а json.NewDecoder(r).Decode(&v) читает из io.Reader, избегая полной буферизации в памяти. Кастомная логика сериализации реализуется через интерфейсы json.Marshaler и json.Unmarshaler посредством методов MarshalJSON() и UnmarshalJSON() у типа. Когда производительность критична — например в высоконагруженных Go-микросервисах — совместимые замены вроде github.com/json-iterator/go или кодогенерируемые библиотеки типа easyjson предлагают значительно меньшее число выделений памяти, чем стандартный encoding/json.
Как это работает
encoding/json знаменита batteries-included: net/http (production-уровневый HTTP клиент + сервер), encoding/json/xml/csv (сериализация), database/sql (интерфейс — в паре с драйвером типа pgx, go-sql-driver/mysql), os + os/exec + io/fs (файлы, процессы), crypto/* (хеширование, шифры, TLS), context (cancellation + значения), time, regexp, text/template / html/template, log/slog (структурированное логирование, 1.21+).
Когда применять
По умолчанию stdlib — большинство, к чему тянутся в npm/pip других языков, уже в Go-stdlib. log/slog — для нового логирования (заменяет log + logrus + zap для большинства нужд). net/http-сервер напрямую — пока реально не нужен фреймворк. database/sql + драйвер — вместо ORM, кроме случая многих тривиальных CRUD-эндпойнтов.
Типичные ошибки
Ловушки encoding/json: свой HTTP-роутинг вместо net/http.ServeMux (route patterns в 1.22 — достаточно для многих приложений); игнор http.Server.ReadTimeout и WriteTimeout (slowloris / hung-connection уязвимости); time.Now() прямо в тестах (мок через интерфейс или clockwork); json.Marshal неэкспортированных полей struct (тихо ноль — пишите с заглавной или используйте json:"...").