JSON Marshal: преобразование типа данных
Иногда мы хотим не преобразовывать значение поля как есть, а предоставить пользовательское значение для маршалинга. Это может быть достигнуто путем реализации интерфейса json.Marshaler или интерфейса encoding.TextMarshaler.
Если значение поля реализует один из вышеперечисленных интерфейсов, функция Marshal не будет рассматривать значение поля для маршалинга и вместо этого будет использовать значение, возвращаемое методом MarshalJSON или методом MarshalText.
Пришло время поработать с кодом!
В приведенном выше примере тип структуры Profile реализует метод MarshalJSON, следовательно, реализует интерфейс Marshaler. Когда Marshal встречается значение type Marshaler, он вызывает этот метод, чтобы получить данные JSON (срез байтов) вместо маршалинга значения.
Мы также модифицировали поле Age типа структуры Student. Теперь он содержит значение типа Age, которое является алиасом типа int. тип структуры Age реализует метод MarshalText, что означает, что он реализует интерфейс TextMarshaler, определенный в пакете encoding.
Когда Marshal встречает значение типа TextMarshaler, он вызывает метод MarshalText и использует значение, возвращаемое этим методом, для кодирования строкового значения JSON. Следовательно, эта программа выдает следующий результат.