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

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

ruisui883个月前 (01-23)技术分析13

    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格式数据” 的相关文章

首个支持苹果 M1 Mac 的 Linux 发行版发布,面向用户开放下载

IT之家 3 月 20 日消息,Asahi Linux 是研究 Linux for Apple Silicon macs 的组织群体,3 月 18 日,Asahi Linux 宣布成功在 M1 MacBook Air 笔记本电脑上运行,并开放了 Asahi Linux 的下载安装。Asahi Lin...

vue3中父子传值、defineProps用法、defineEmits用法

Vue3中新增了一个 script setup 语法糖模式,可以在单文件组件中更简洁地编写组件逻辑。使用 script setup 语法后,props、data、computed、methods 等选项不再需要独立定义,而是可以直接在 setup 函数中声明,代码结构更加清晰,并且可以更方便地使用响...

如何在GitLab上回退指定版本的代码?GitLab回退指定版本问题分析

在Git中,回退到指定版本并不是删除或撤销之前的提交,而是创建一个新的提交,该提交包含指定版本的内容。这意味着您需要将当前代码更改与指定版本之间的差异进行比较,并将其合并到一个新的提交中。如果您没有更新本地代码,并且您希望将 GitLab 仓库回退到指定版本,您可以使用以下命令:git fetchg...

2024年,不断突破的一年

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

12种JavaScript中最常用的数组操作整理汇总

数组是最常见的数据结构之一,我们需要绝对自信地使用它。在这里,我将列出 JavaScript 中最重要的几个数组常用操作片段,包括数组长度、替换元素、去重以及许多其他内容。1、数组长度大多数人都知道可以像这样得到数组的长度:const arr = [1, 2, 3]; console.log(a...

慕课 SpringBoot2.X+Vue+UniAPP,全栈开发医疗小程序

本课程以业务驱动技术栈,打造业务相对完整的掌上医疗小程序,解决大家没有好的毕设项目或者求职项目的困境。本课程案例采用前后端分离架构,业务功能完善(既有WEB管理端,也有移动用户端),界面美观,无需艰涩的技术也能做出亮眼的作品。SpringBoot2.X+Vue+UniAPP,全栈开发医疗小程序 |...