JSON в Go: теги, опущение полей и подводные камни
Маршалинг JSON в Go завязан на теги структурных полей. Без тега имя поля в JSON совпадёт с именем в Go — с большой буквы, что редко нужно.
type User struct {
Name string `json:"name"`
Email string `json:"email,omitempty"`
id int // приватное — не попадёт в JSON
}omitempty и его сюрпризы
Опция omitempty опускает поле, если оно равно нулевому значению. Но «ноль» для чисел — это 0, а для булева — false. То есть валидное значение false тоже пропадёт из вывода.
Если нужно различать «не задано» и «задано в ноль» — используйте указатели: *bool вместо bool. Тогда nil — «не задано», а &false — честный false.