当前位置:首页 > 技术分析 > 正文内容

golang2021数据格式(69)Go语言将结构体数据保存为JSON格式数据

ruisui885个月前 (01-23)技术分析21

    JSON 格式是一种对象文本格式,是当前互联网最常用的信息交换格式之一。在Go语言中,可以使用 json.Marshal() 函数将结构体格式的数据格式化为 JSON 格式。

    想要使用 json.Marshal() 函数需要我们先引入 encoding/json 包,示例代码如下:

    package main

    import (
    "encoding/json"
    "fmt"
    )

    func main() {
    // 声明技能结构体
    type Skill struct {
    Name string
    Level int
    }
    // 声明角色结构体
    type Actor struct {
    Name string
    Age int
    Skills []Skill
    }
    // 填充基本角色数据
    a := Actor{
    Name: "cow boy",
    Age: 37,
    Skills: []Skill{
    {Name: "Roll and roll", Level: 1},
    {Name: "Flash your dog eye", Level: 2},
    {Name: "Time to have Lunch", Level: 3},
    },
    }
    result, err := json.Marshal(a)
    if err != nil {
    fmt.Println(err)
    }
    jsonStringData := string(result)
    fmt.Println(jsonStringData)
    }

    运行结果如下:

    {

    "Name":"cow boy",

    "Age":37,

    "Skills":[

    {

    "Name":"Roll and roll",

    "Level":1

    },

    {

    "Name":"Flash your dog eye",

    "Level":2

    },

    {

    "Name":"Time to have Lunch",

    "Level":3

    }

    ]

    }

    通过运行结果可以看出我们成功的将结构体数据转换成了 JSON 格式。

    提示:为了便于查看这里将输出结果做了格式化处理。

    在转换 JSON 格式时,JSON 的各个字段名称默认使用结构体的名称,如果想要指定为其它的名称我们可以在声明结构体时添加一个`json:" "`标签,在" "中可以填入我们想要的内容,代码如下所示:

    package main

    import (
    "encoding/json"
    "fmt"
    )

    func main() {
    // 声明技能结构体
    type Skill struct {
    Name string `json:"name"`
    Level int `json:"level"`
    }
    // 声明角色结构体
    type Actor struct {
    Name string
    Age int
    Skills []Skill
    }
    // 填充基本角色数据
    a := Actor{
    Name: "cow boy",
    Age: 37,
    Skills: []Skill{
    {Name: "Roll and roll", Level: 1},
    {Name: "Flash your dog eye", Level: 2},
    {Name: "Time to have Lunch", Level: 3},
    },
    }
    result, err := json.Marshal(a)
    if err != nil {
    fmt.Println(err)
    }
    jsonStringData := string(result)
    fmt.Println(jsonStringData)
    }

    运行结果如下:

    {

    "Name":"cow boy",

    "Age":37,

    "Skills":[

    {

    "name":"Roll and roll",

    "level":1

    },

    {

    "name":"Flash your dog eye",

    "level":2

    },

    {

    "name":"Time to have Lunch",

    "level":3

    }

    ]

    }

    通过运行结果可以看出,我们成功将 Skill 结构体的 Name 和 Level 字段转换成了想要的内容。

    我们还可以在上面的标签的" "中加入 omitempty(使用逗号,与前面的内容分隔),来过滤掉转换的 JSON 格式中的空值,如下所示:

    package main

    import (
    "encoding/json"
    "fmt"
    )

    func main() {
    // 声明技能结构体
    type Skill struct {
    Name string `json:"name,omitempty"`
    Level int `json:"level"`
    }
    // 声明角色结构体
    type Actor struct {
    Name string
    Age int
    Skills []Skill
    }
    // 填充基本角色数据
    a := Actor{
    Name: "cow boy",
    Age: 37,
    Skills: []Skill{
    {Name: "", Level: 1},
    {Name: "Flash your dog eye"},
    {Name: "Time to have Lunch", Level: 3},
    },
    }
    result, err := json.Marshal(a)
    if err != nil {
    fmt.Println(err)
    }
    jsonStringData := string(result)
    fmt.Println(jsonStringData)
    }

    运行结果如下:

    {

    "Name":"cow boy",

    "Age":37,

    "Skills":[

    {

    "level":1

    },

    {

    "name":"Flash your dog eye",

    "level":0

    },

    {

    "name":"Time to have Lunch",

    "level":3

    }

    ]

    }

    通过对比 Skill 结构体的 Name 和 Level 字段可以看出,Name 字段的空值被忽略了,而 Level 字段则没有。

    `json:" "` 标签的使用总结为以下几点:

    • FieldName int `json:"-"`:表示该字段被本包忽略;

    • FieldName int `json:"myName"`:表示该字段在 JSON 里使用“myName”作为键名;

    • FieldName int `json:"myName,omitempty"`:表示该字段在 JSON 里使用“myName”作为键名,并且如果该字段为空时将其省略掉;

    • FieldName int `json:",omitempty"`:该字段在json里的键名使用默认值,但如果该字段为空时会被省略掉,注意 omitempty 前面的逗号不能省略。



扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/491.html

分享给朋友:

“golang2021数据格式(69)Go语言将结构体数据保存为JSON格式数据” 的相关文章

Git 分支管理策略汇总

最近,团队新入职了一些小伙伴,在开发过程中,他们问我 Git 分支是如何管理的,以及应该怎么提交代码?我大概说了一些规则,但仔细想来,好像也并没有形成一个清晰规范的流程。所以查了一些资料,总结出下面这篇文章,一共包含四种常见的分支管理策略,分享给大家。Git flow在这种模式下,主要维护了两类分支...

一次Java内存占用高的排查案例,解释了我对内存问题的所有疑问

问题现象7月25号,我们一服务的内存占用较高,约13G,容器总内存16G,占用约85%,触发了内存报警(阈值85%),而我们是按容器内存60%(9.6G)的比例配置的JVM堆内存。看了下其它服务,同样的堆内存配置,它们内存占用约70%~79%,此服务比其它服务内存占用稍大。那为什么此服务内存占用稍大...

2024年,不断突破的一年

迈凯伦F1车队不久前拿下了2024年度总冠军,距离上一次还是二十几年前。在此期间,另一领域内,一个充满革新活力的腕表品牌——RICHARD MILLE理查米尔,正不断发展,与F1运动、帆船、古董车展等领域,共享着对速度与极限的无尽向往。RICHARD MILLE的发展与F1车手们在赛道上的卓越表现交...

三维家-系统快捷键使用

快键件使用:通过简单的键盘+鼠标操作,快速完成搭配。1.基础快捷键1) Ctrl+V:复制选中对象第一步:鼠标左击物体,按下Ctrl+V 即可复制选中对象。2) Ctrl+G:组合多选对象第一步:按住Ctrl键多选对象--按住Ctrl+G--确定。3) Ctrl+B:解组选中对象第一步:左击选中对象...

别让“跑焦”毁所有!仅需这一项设置,即可显著改善镜头对焦精度

我常常会收到一些摄影爱好者的私信,也一直在努力的帮助大家解决更多摄影中常见问题。在我收到的所有问题中。有一个问题是最麻烦的,那就是“为什么我的图像看起来模糊?”。这个问题几乎每个人都遇到过,究其原因可以说是多种多样相对复杂。起初我一直认为是对焦问题所导致,也就有了我之前所写的“后按对焦”以及“对焦模...

一文让你彻底搞懂 vue-Router

路由是网络工程里面的专业术语,就是通过互联把信息从源地址传输到目的地址的活动。本质上就是一种对应关系。分为前端路由和后端路由。后端路由:URL 的请求地址与服务器上的资源对应,根据不同的请求地址返回不同的资源。前端路由:在单页面应用中,根据用户触发的事件,改变URL在不刷新页面的前提下,改变显示内容...