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, и для маршалинга выбираются наименее вложенные поля.