Если вы новичок в Go и столкнулись с разочаровывающей проблемой, когда json.Marshal(struct) возвращает пустые фигурные скобки {}, вы не одиноки. Эта проблема сбивает с толку многих начинающих разработчиков Go. Давайте разберемся, почему это происходит, и как это исправить.

Основная причина: неэкспортированные поля структуры
В Go экспортированными считаются только поля структуры, имена которых начинаются с заглавной буквы. Пакет encoding/json и другие подобные пакеты игнорируют неэкспортированные поля.
Рассмотрим простой пример:
type myStruct struct {
name string
age int
}
func main() {
data := myStruct{name: "Alice", age: 30}
jsonData, _ := json.Marshal(data)
fmt.Println(string(jsonData)) // Вывод: {}
}Как видите, несмотря на то, что мы заполнили поля name и age, результатом json.Marshal являются пустые фигурные скобки. Это происходит потому, что поля name и age не экспортируются (начинаются со строчной буквы).
Решение: экспортируйте поля структуры
Чтобы исправить эту проблему, просто экспортируйте поля структуры, изменив первую букву их имен на заглавную:
type myStruct struct {
Name string
Age int
}
func main() {
data := myStruct{Name: "Alice", Age: 30}
jsonData, _ := json.Marshal(data)
fmt.Println(string(jsonData)) // Вывод: {"Name":"Alice","Age":30}
}Теперь json.Marshal возвращает ожидаемый JSON-код с полями Name и Age.
Использование тегов структуры для настройки JSON
Строки json:"...", которые следуют за объявлениями полей, являются тегами структуры. Теги в этой структуре задают имена полей структуры при маршалинге в JSON и из JSON.
Например, можно использовать теги структуры, чтобы задать другое имя поля в JSON или пропустить поле, если оно пустое:
type myStruct struct {
Name string `json:"full_name"`
Age int `json:"age,omitempty"`
}В этом примере поле Name будет называться full_name в JSON, а поле Age будет пропущено, если оно пустое.
Заключение
Проблема, когда json.Marshal(struct) возвращает {}, обычно возникает из-за неэкспортированных полей структуры. Чтобы исправить это, просто экспортируйте поля структуры, изменив первую букву их имен на заглавную. Кроме того, можно использовать теги структуры для настройки JSON-вывода.
Оставить комментарий