猿问

如何有选择地为结构封送 JSON?

我有一个结构:


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

是否可以?



叮当猫咪
浏览 126回答 3
3回答

MMMHUHU

为什么你只是这样做下面type SubPaper struct {    PID    int    `json:"pID"`    PPwd   string `json:"pPwd"`}type Paper struct {    SubPaper    PTitle string `json:"pTitle"`    PDesc  string `json:"pDesc"`}如果你想要完整的回应,然后整理报纸和 SubPaper 选择性的东西

慕桂英4014372

在标签中使用 omitempty。创建结构体实例时无需指定要包含的项目。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”:“描述 1”}唯一的问题是,如果 PID 明确为 0,那么它仍然会忽略它。喜欢:Paper{PTitle: "Title 1", PDesc: "Desc 1", PID:0} 那么它仍然会打印 {"pTitle":"Title 1","pDesc":"Desc 1"}另一种使用嵌入类型的方法:请注意,嵌入类型必须是指针,以便它可以为 nil,然后 omitempty 可以排除它。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”:“描述 1”}如果需要纸张的嵌套内部结构,请将其标记为 *Paperjson:"paper,omitempty"

狐的传说

也许最简单的方法是创建一个 struct embeds 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将被省略。
随时随地看视频慕课网APP

相关分类

Go
我要回答