前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Golang -- Json序列化

Golang -- Json序列化

作者头像
None_Ling
发布2021-11-24 15:15:59
7270
发布2021-11-24 15:15:59
举报
文章被收录于专栏:Android相关Android相关Android相关

简述

在使用Go Struct的Json Marshal的时候,通过Json To Go Struct工具可以生成结构体,但是当在结构体中只对部分属性赋值的时候,Marshal后的字符串与预期不符,如下所示:

当定义了Host中包含A、B、C三个结构体时,如果只为其中一个结构赋值,我们期望Json中只包含这一个结构体的值。

func main() {
    host := Host{
        OA: A{
            Content: "oa",
        },
    }
    data, _ := json.Marshal(host)
    fmt.Printf("data:%s", string(data))
}

// A
type A struct {
    Content string `json:"content1"`
    Text string `json:"content2"`
}

// B
type B struct {
    Content string `json:"content3"`
}

// C RTX富文本内容文本类型
type C struct {
    Content string `json:"content4"`
}

// RichText RTX富文本内容
type Host struct {
    OA A `json:"text1"`
    OB B `json:"text2"`
    OC C `json:"text3"`
}

当其他属性为空时,不要将该属性加入Json串中,但是实际上会输出。

// 期望值
data:{"text1":{"content1":"oa"}}
// 实际值
data:{"text1":{"content1":"oa","content2":""},"text2":{"content3":""},"text3":{"content4":""}}

omitempty的作用

当为所有结构体(HostABC)中都加入了omitempty标记后,运行后发生如下变化:

data:{"text1":{"content1":"oa"},"text2":{},"text3":{}}

omitempty只能作用于string或者int等简单类型的数据,而无法作用于结构体对象。

结构体指针

当遇见该种情况时,则需要使用结构体指针即可解决

func main() {
    host := Host{
                // 将A的指针传入
        OA: &A{
            Content: "oa",
        },
    }
    data, _ := json.Marshal(host)
    fmt.Printf("data:%s", string(data))
}

// A
type A struct {
    Content string `json:"content1,omitempty"`
    Text int `json:"content2,omitempty"`
}

// B
type B struct {
    Content string `json:"content3,omitempty"`
}

// C RTX富文本内容文本类型
type C struct {
    Content string `json:"content4,omitempty"`
}

// RichText RTX富文本内容
type Host struct {
        // 复杂结构体都使用指针定义,同时声明omitempty即可
    OA *A `json:"text1,omitempty"`
    OB *B `json:"text2,omitempty"`
    OC *C `json:"text3,omitempty"`
}

得到的输出:

data:{"text1":{"content1":"oa"}}

参考资料

Go's "omitempty" explained How to not marshal an empty struct into JSON with Go?

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021/9/22 下,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简述
  • omitempty的作用
  • 结构体指针
  • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档