Set tags for imported structure in Go
I am using gorm ( g o orm ) to fetch data from my database to be JSON encoded. Gorm provides a default structure for primary keys and time tracking, whose DeletedAt attribute does not need to be JSON encoded.
I wrote a small example that doesn't display the password, but the DeletedAt attribute is still displayed.
package main import ( "encoding/json" "fmt" "os" "github.com/jinzhu/gorm" _ "github.com/lib/pq" _ "github.com/mattn/go-sqlite3" ) // Struct from the gorm package: // // type Model struct { // ID uint `gorm:"primary_key"` // CreatedAt time.Time // UpdatedAt time.Time // DeletedAt *time.Time // } // Defines the database model for gorn type User struct { gorm.Model Username string `json:"username" sql:"size:32; not null; unique"` Password string `json:"password" sql:"not null"` Locale string `json:"locale" sql:"not null"` } // Public JSON version of database model type PublicUser struct { *User DeletedAt bool `json:"deletedAt,omitempty"` Password bool `json:"password,omitempty"` } func main() { db, err := gorm.Open("sqlite3", "storage.db") if err != nil { fmt.Println(err) } u := &User{} db.Where("id = ?", 3).Find(&u) json.NewEncoder(os.Stdout).Encode(PublicUser{ User: u, }) }
This will be our error if I run my script:
{
"ID":3,
"CreatedAt":"2015-05-13T14:54:23.5577227Z",
"UpdatedAt":"2015-05-13T14:54:23.5577227Z",
"DeletedAt":null,
"username":"dan",
"locale":"en_US"
}
I modified Alfred Rossi's example to mimic his behavior and I got the same result.
+3
source to share
1 answer
You can just shade the field with bool set to false and mark it omitempty
for example
type User struct {
Username string `json:"username"`
DeletedAt int `json:"deleted_at"`
}
type PublicUser struct {
*User
DeletedAt bool `json:"deleted_at,omitempty"`
}
Feel free to play with it here . Also see this post on Attila Ola's blog .
+2
source to share