Если вы новичок в 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-вывода.
Оставить комментарий