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

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

    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 前面的逗号不能省略。



相关文章

费用报销单填写及粘贴全攻略:避免常见错误!附费用报销管理系统

费用报销单是企业日常财务管理中的重要工具,用于记录和核销员工在工作中产生的各类费用。填写准确的费用报销单不仅能够保证财务报销流程的顺利进行,还能提高工作效率,确保公司资金的合理使用。在填写报销单时,员...

适合在任何地方使用的 Linux:15 个小型 Linux 发行版

如果你有一台老旧的 PC 或超小型设备,这些 Linux 发行版中的一个应该适合你。来源:https://linux.cn/article-12281-1.html作者:David Gewirtz译者...

2020年最漂亮的7个Linux发行版(最受欢迎的linux发行版)

请关注本头条号,每天坚持更新原创干货技术文章。如需学习视频,请在微信搜索公众号“智传网优”直接开始自助视频学习1. 前言对于想学习Linux的朋友们,心中一定有疑问,哪个Linux版本比较好入门,Li...

微软的Linux发行版终于加入了对XFS根文件系统的支持

当许多Linux发行版在评估新的根文件系统选项或甚至像OpenZFS这样的特性,微软内部Linux发行版到本月才开始支持XFS作为根文件系统选项。随着这个月对微软内部Linux发行版CBL-Marin...

据说是可以替代 Windows 的 5个 Linux 发行版

现如今有数以千计的 Linux 发行版可供您使用,然而人们却无法选择一个完美的操作系统来替代 Windows。 使用 Windows 时,傻瓜都能操作自如,同样的方法却不适用于 Linux。在这里,您...

10分钟搞定gitlab-ci自动化部署(gitlab ci 配置)

gitlab-ci 是持续集成工具/自动化部署工具,类似 jenkins。持续集成 是将代码集成到共享存储库并尽可能早地自动构建/测试每个更改的实践 - 通常一天几次。概述在编码完成时都会进行打包发布...