我有一个结构:
type Paper struct {
PID int `json:"pID"`
PTitle string `json:"pTitle"`
PDesc string `json:"pDesc"`
PPwd string `json:"pPwd"`
}
通常,我会将整个结构编码为JSON。但是,有时候,我需要 结构的简短版本;即对一些属性进行编码,我应该如何实现此功能?
type BriefPaper struct {
PID int `json:"-"` // not needed
PTitle string `json:"pTitle"`
PDesc string `json:"pDesc"`
PPwd string `json:"-"` // not needed
}
我正在考虑创建子集结构,类似于BriefPaper = SUBSET(Paper)
,但不确定如何在Golang中实现它。
我希望我可以做这样的事情:
p := Paper{ /* ... */ }
pBrief := BriefPaper{}
pBrief = p;
p.MarshalJSON(); // if need full JSON, then marshal Paper
pBrief.MarshalJSON(); // else, only encode some of the required properties
有可能吗?
答案 0 :(得分:2)
执行此操作的最简单方法可能是创建一个嵌入Paper
的结构,并遮盖要隐藏的字段:
type Paper struct {
PID int `json:"pID"`
PTitle string `json:"pTitle"`
PDesc string `json:"pDesc"`
PPwd string `json:"pPwd"`
}
type BriefPaper struct {
Paper
PID int `json:"pID,omitempty"` // Just make sure you
PPwd string `json:"pPwd,omitempty"` // don't set these fields!
}
p := Paper{ /* ... */ }
pBrief := BriefPaper{Paper: p}
现在封送BriefPaper
时,字段PID
和PPwd
将被省略。
答案 1 :(得分:1)
为什么您要在下面这样做
type SubPaper struct {
PID int `json:"pID"`
PPwd string `json:"pPwd"`
}
type Paper struct {
SubPaper
PTitle string `json:"pTitle"`
PDesc string `json:"pDesc"`
}
如果您想得到完整答复,请整理论文
和SubPaper选择性内容
答案 2 :(得分:-1)
在标签中使用省略号。创建结构实例时无需指定要包括的项目。
type Paper struct {
PID int `json:"pID,omitempty"`
PTitle string `json:"pTitle"`
PDesc string `json:"pDesc"`
PPwd string `json:"pPwd,omitempty"`
}
func main() {
u := Paper{PTitle: "Title 1", PDesc: "Desc 1"}
b, _ := json.Marshal(u)
fmt.Println(string(b))
}
打印:{“ pTitle”:“标题1”,“ pDesc”:“ Desc 1”}
唯一的问题是,如果PID显式为0,那么它仍然会忽略它。
赞:
纸张{PTitle:“标题1”,PDesc:“ Desc 1”,PID:0} 然后它将仍然打印{“ pTitle”:“ Title 1”,“ pDesc”:“ Desc 1”}
使用嵌入式类型的另一种方法:
请注意,嵌入类型必须是指针,以便它可以为nil,然后omtempty可以排除它。
type Paper struct {
PID int `json:"pID"`
PPwd string `json:"pPwd"`
}
type BriefPaper struct {
PTitle string `json:"pTitle"`
PDesc string `json:"pDesc"`
*Paper `json:",omitempty"`
}
func main() {
u := BriefPaper{PTitle: "Title 1", PDesc: "Desc 1"}
b, _ := json.Marshal(u)
fmt.Println(string(b))
}
打印:{“ pTitle”:“标题1”,“ pDesc”:“ Desc 1”}
如果需要用于纸张的嵌套内部结构,则将其标记为* Paper json:"paper,omitempty"