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

在 JSON 响应中省略结构字段

在 JSON 响应中省略结构字段

Go
三国纷争 2022-06-27 11:00:23
我有一个包含一些字段的结构,如下所示:type Test struct {    ID        int          `json:"id"`    Active    bool         `json:"active"`    Object    []obj.Object `json:"objects"`}然后是一些将测试对象编码为 JSON 作为响应的处理函数,但在其中一个函数中,我想省略响应中的最后一个字段“对象”。我知道json:"-"省略了它,但问题是我需要该字段用于其他功能。我将对象编码为 JSON 的方式是使用这种方法: json.NewEncoder(w).Encode(t)有没有办法我可以做到这一点?提前致谢!
查看完整描述

3 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

您可以将 omitempty 标记与指针结构一起使用。在这种情况下,如果指针为零,则不会编组字段。(https://play.golang.org/p/7DihRGmW0jZ) 例如


package main


import (

    "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)

}


查看完整回答
反对 回复 2022-06-27
?
噜噜哒

TA贡献1784条经验 获得超7个赞

使用的解决方案omitempty通常是最简单的,但这里有一个替代解决方案,可用于更复杂的场景。这利用了这样一个事实,即只要结构相同,即使标签不同,值也可以转换为另一种类型:https : //play.golang.org/p/ZT6gbhsXxmD


type 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 之前从字段中删除值,或者您有更复杂的数据结构。


查看完整回答
反对 回复 2022-06-27
?
交互式爱情

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

省略值的简单方法是使用omitemptyjson 的标签并编写一个返回对象的方法,如下所示:


package main


import (

    "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}


查看完整回答
反对 回复 2022-06-27
  • 3 回答
  • 0 关注
  • 112 浏览
慕课专栏
更多

添加回答

举报

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