Skip to content

JSON Marshal: использование тегов структуры

Поле struct может содержать дополнительные метаданные, которые могут использоваться другими программами для обработки этого поля по-другому. Эти метаданные назначаются полю с помощью строкового литерала (необработанная строка [``] или интерпретируемая строка [“”]).

Теги структуры могут использоваться:

  • программами типа encoder/decoder для получения дополнительной информации о поле;

  • механизмами проверки, такими как валидатор, для получения критериев проверки;

  • механизмами ORM типа GORM для данных столбца таблицы.

Теги структуры игнорируются в общих случаях использования, но если т__ы хо__чешь прочитать тег поля структуры, т__ы може__шь использовать встроенный пакет reflect, о котором подробнее узнаешь по ссылке. А пример описанного случая посмотри на сайте go.dev.

В нашем случае функция Marshal использует тег поля struct для получения дополнительной информации encoding/decoding из поля. Для преобразования в JSON нам нужно использовать значение тега json:"options". Здесь строковые значения options, разделены запятыми.

Первое значение option — это имя поля, которое должно появиться в JSON. Другими значениями option могут быть omitempty отбрасывание поля, если его значение пусто, или string преобразование значения поля в строку.

Как гласит статья о JSON package, опция omitempty указывает, что поле должно быть исключено из кодировки, если поле имеет пустое значение, определенное как false, 0, указатель nil, значение интерфейса nil и любые пустые array, slice, map или string. Параметр string указывает, что поле хранится как JSON внутри строки в кодировке JSON. Он применяется только к полям типов string, float, int или bool.

Если мы хотим игнорировать поле безоговорочно, мы можем использовать его в качестве значения “-“.

Пришло время поработать с кодом!

Единственная странность в приведенной выше программе — это тег json:"", который на самом деле ничего не делает, поэтому он игнорируется функцией Marshal. Все остальное должно быть понятно. Эта программа выше выдает следующий результат.

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

С помощью этих простых правил теги дают нам больший контроль над продвижением полей. Конфликтующие поля (с тегами или без тегов) группируются по именам полей JSON, и для маршалинга выбираются наименее вложенные поля.