英文:
How to response all field include field with tag omitempty in Golang?
问题
在我的Web服务中,我有一个模型:
// Comment结构体
type Comment struct {
Owner UserObject json:"owner"
ID int64 json:"id"
Message string json:"message"
Mentions []MentionObject json:"mentions,omitempty"
CreatedAt int64 json:"created_at,omitempty"
UpdatedAt int64 json:"updated_at,omitempty"
Status int json:"status,omitempty"
CanEdit bool json:"can_edit"
CanDelete bool json:"can_delete"
}
// UserObject结构体
type UserObject struct {
ID int64 json:"id"
Username string json:"username"
FullName string json:"full_name"
Avatar string json:"avatar"
}
// MentionObject结构体
type MentionObject struct {
ID int64 json:"id"
Length int64 json:"length"
Offset int64 json:"offset"
}
我使用gin gonic进行路由:
routes.GET("/user", func(c *gin.Context) {
c.JSON(200, Comment{})
})
我需要返回这个结构体的所有字段,我知道它将返回一个JSON:
{
"owner": {
"id": 0,
"username": "",
"full_name": "",
"avatar": ""
},
"id": 0,
"message": "",
"can_report": false,
"can_edit": false,
"can_delete": false
}
我知道这是正确的,但我仍然想要返回所有字段。怎么做呢?
英文:
In my Webservice, I have a model:
// Comment struct
type Comment struct {
Owner UserObject `json:"owner"`
ID int64 `json:"id"`
Message string `json:"message"`
Mentions []MentionObject `json:"mentions,omitempty"`
CreatedAt int64 `json:"created_at,omitempty"`
UpdatedAt int64 `json:"updated_at,omitempty"`
Status int `json:"status,omitempty"`
CanEdit bool `json:"can_edit"`
CanDelete bool `json:"can_delete"`
}
// UserObject struct
type UserObject struct {
ID int64 `json:"id"`
Username string `json:"username"`
FullName string `json:"full_name"`
Avatar string `json:"avatar"`
}
// MentionObject struct
type MentionObject struct {
ID int64 `json:"id"`
Length int64 `json:"length"`
Offset int64 `json:"offset"`
}
I have use gin gonic to routing
routes.GET("/user", func(c *gin.Context) {
c.JSON(200, Comment{})
})
I need return all fields of this struct, I know that It going to response a json:
{
"owner": {
"id": 0,
"username": "",
"full_name": "",
"avatar": ""
},
"id": 0,
"message": "",
"can_report": false,
"can_edit": false,
"can_delete": false
}
I know that This is right, but I still want response all of field.
How to do that?
答案1
得分: 3
如果您不想从标签中删除omitempty
值,因为您需要它用于其他目的,您可以在Go 1.8+上定义一个与要序列化的类型相同但没有omitempty
标签值的新type
,然后简单地将旧类型的值转换为新类型。
您还可以定义一个仅包含原始类型中省略字段的新类型,然后在新类型中嵌入原始类型如下所示。
英文:
If you don't want to drop the omitempty
value from the tag because you need it for some other purpose, you can either, if you're on Go 1.8+, define a new type
identical to the one you want to serialize but without the omitempty
tag values and then simply convert a value from the old type to the new type.
Here's an example of the 1.8+ "tag ignoring" type conversion
You can also define a new type with only those fields that are omitted in the original and then embed the original in the new type like so.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论