猿问

在 JSON 响应中省略结构字段

我有一个包含一些字段的结构,如下所示:


type Test struct {

    ID        int          `json:"id"`

    Active    bool         `json:"active"`

    Object    []obj.Object `json:"objects"`

}

然后是一些将测试对象编码为 JSON 作为响应的处理函数,但在其中一个函数中,我想省略响应中的最后一个字段“对象”。我知道json:"-"省略了它,但问题是我需要该字段用于其他功能。


我将对象编码为 JSON 的方式是使用这种方法:


 json.NewEncoder(w).Encode(t)

有没有办法我可以做到这一点?提前致谢!


三国纷争
浏览 113回答 3
3回答

繁星coding

您可以将 omitempty 标记与指针结构一起使用。在这种情况下,如果指针为零,则不会编组字段。(https://play.golang.org/p/7DihRGmW0jZ) 例如package mainimport (    "encoding/json"    "fmt")type Test struct {        ID          *int          `json:"id,omitempty"`        Active      *bool         `json:"active,omitempty"`        Object      *interface{}  `json:"objects,omitempty"`}func main() {    var result Test    id:= 1    active := true    result.ID = &id    result.Active = &active        b, err := json.Marshal(result)    if err != nil {        panic(err)    }    fmt.Printf("%s\n", b)}

噜噜哒

使用的解决方案omitempty通常是最简单的,但这里有一个替代解决方案,可用于更复杂的场景。这利用了这样一个事实,即只要结构相同,即使标签不同,值也可以转换为另一种类型:https : //play.golang.org/p/ZT6gbhsXxmDtype Test struct {    ID     int      `json:"id"`    Active bool     `json:"active"`    Object []Object `json:"objects,omitempty"`}type Test2 struct {    ID     int      `json:"id"`    Active bool     `json:"active"`    Object []Object `json:"-"`}func main() {    var t Test    t.ID = 1    t.Active = true    t.Object = make([]Object, 1)    fmt.Println("Test:")    json.NewEncoder(os.Stdout).Encode(t)    fmt.Println("Test2:")    t2 := Test2(t)    json.NewEncoder(os.Stdout).Encode(&t2)}这在很多情况下都很有用,例如,您不想在发送到 JSON 之前从字段中删除值,或者您有更复杂的数据结构。

交互式爱情

省略值的简单方法是使用omitemptyjson 的标签并编写一个返回对象的方法,如下所示:package mainimport (    "encoding/json"    "fmt"    "os")type Test struct {    ID     int      `json:"id"`    Active bool     `json:"active"`    Object []Object `json:"objects,omitempty"`}type Object struct {    TEMP string}func (t Test) getData() Test {    return Test{ID: t.ID, Active: t.Active}}func main() {    var t Test    t.ID = 1    t.Active = true    t.Object = make([]Object, 1)    fmt.Println(t)    fmt.Println(t.getData())    json.NewEncoder(os.Stdout).Encode(t)    fmt.Println("--------")    json.NewEncoder(os.Stdout).Encode(t.getData())}结果如下:{1 true [{}]}{1 true}{"id":1,"active":true,"objects":[{"TEMP":""}]}--------{"id":1,"active":true}
随时随地看视频慕课网APP

相关分类

Go
我要回答