Почему json.Marshal(struct) возвращает {}? Основная причина и как это исправить

Если вы новичок в 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)) // Вывод: {}
}

Playground link

Как видите, несмотря на то, что мы заполнили поля 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-вывода.

Рекомендуем к прочтению



Оставить комментарий

Этот сайт защищен reCAPTCHA и применяются Политика конфиденциальности и Условия обслуживания применять.

Срок проверки reCAPTCHA истек. Перезагрузите страницу.