如何选择性地将JSON编组为结构?

时间:2019-07-11 06:28:10

标签: go

我有一个结构:

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

有可能吗?

3 个答案:

答案 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时,字段PIDPPwd将被省略。

答案 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"