为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
叮当猫咪 2023-07-04 10:04:22
我有一个结构: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 PaperpBrief.MarshalJSON(); // else, only encode some of the required properties是否可以?去
查看完整描述

3 回答

?
MMMHUHU

TA贡献1834条经验 获得超8个赞

为什么你只是这样做下面


type SubPaper struct {

    PID    int    `json:"pID"`

    PPwd   string `json:"pPwd"`

}


type Paper struct {

    SubPaper

    PTitle string `json:"pTitle"`

    PDesc  string `json:"pDesc"`

}

如果你想要完整的回应,然后整理报纸


和 SubPaper 选择性的东西


查看完整回答
反对 回复 2023-07-04
?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

在标签中使用 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"


查看完整回答
反对 回复 2023-07-04
?
狐的传说

TA贡献1804条经验 获得超3个赞

也许最简单的方法是创建一个 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将被省略。


查看完整回答
反对 回复 2023-07-04
  • 3 回答
  • 0 关注
  • 125 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信