Как игнорировать поле ассоциации в выводе JSON, когда оно не загружено? - PullRequest
0 голосов
/ 05 мая 2020

В моих моделях gorm у меня есть Пользователь и Профиль:

type User struct {
    ID            int    
    Username      string
    Password      string     `json:"-"`

    Profile Profile
}

type Profile struct {
    UserID        int    
    Gender        string
    Places        string

    //...And many more fields
}

Когда я ищу полное отображение своего профиля, используя:

db.Preload("Profile").Where("id = ?", 1).First(&user)
c.JSON(200, user) 

JSON результат, который получит клиентская сторона, совершенно нормальный:

{
    "ID": 1,
    "Username": {
        "String": "",
        "Valid": false
    },
    "Profile": {
        "UserID": 1,
        "Gender": "men",
        "Places": "Home and staying home",
        // ...And many more
    },
}

Но когда я хочу указать только два поля ID и Username, даже если я не использовал Preload () или Related () Profile, там это все еще пустой набор:

db.Where("id = ?", 1).First(&user)
c.JSON(200, user) 

// Result
{
    "ID": 1,
    "Username": {
        "String": "",
        "Valid": false
    },
    //below is redundant in this situation
    "Profile": {
        "UserID": 0,
        "Gender": "",
        "Places": "",
        // ...And many more 0 or "" fields
    },
}

Мой вопрос в том, как игнорировать поля профиля из ответа JSON каждый раз, когда он не загружен? В целях экономии стоимости трансфера

1 Ответ

2 голосов
/ 05 мая 2020

Вы должны использовать указатель на структуру, если хотите их опустить. Он обнулит его, если не загружен, и не будет отображаться в JSON

type User struct {
    ID            int    
    Username      string
    Password      string     `json:"-"`

    Profile *Profile `json:",omitempty"`
}
...