2.5Kпросмотров
1 августа 2025 г.
statsScore: 2.7K
Продолжаем разбираться с go1.25 который должен выйти уже в этом месяце. В предыдущих версиях encoding/json struct-теги были довольно ограниченными, но в новом пакете encoding/json/v2 появилась мощная опция format, которая позволяет задавать специальное форматирование для разных типов: дат, чисел, байтовых массивов и тд. Пример:
package main import ( "encoding/json/v2" // импортируем новый пакет "math" "time"
) type Data struct { // time.Duration в формате "1h0m0s" (строка) Duration time.Duration json:"duration,format:units" // time.Duration в секундах (числом) DurationSec time.Duration json:"duration_sec,format:sec" // time.Time в формате "YYYY-MM-DD" Date time.Time json:"date,format:'2006-01-02'" // []byte как base64url B64 []byte json:"b64,format:base64url" // float64 с поддержкой NaN и ±Inf в виде строки Val float64 json:"val,format:nonfinite" // nil slice выводится как null (а не []) List []int json:"list,format:emitnull"
} func main() { data := Data{ Duration: time.Hour, DurationSec: time.Hour, Date: time.Now(), B64: []byte("base64url"), Val: math.NaN(), } dataJson, err := json.Marshal(data) // ...
}
Получившийся json:
{ "duration": "1h0m0s", "duration_sec": 3600, "date": "2025-08-01", "b64": "YmFzZTY0dXJs", "val": "NaN", "list": null
}
Раньше приходилось вручную реализовывать MarshalJSON или писать вспомогательные поля, теперь же стало чуточку удобнее 🙌