加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Go语言将结构体数据保存为JSON格式数据

发布时间:2020-12-16 09:36:43 所属栏目:大数据 来源:网络整理
导读:JSON 格式是一种对象文本格式,是当前互联网最常用的信息交换格式之一。在Go语言中,可以使用 json.Marshal() 函数将结构体格式的数据格式化为 JSON 格式。 想要使用 json.Marshal() 函数需要我们先引入 encoding/json 包,示例代码如下: package mainimport
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",err := json.Marshal(a)
    if err != nil {
        fmt.Println(err)
    }
    jsonStringData := string(result)
    fmt.Println(jsonStringData)
}
运行结果如下:

{
??? "Name":"cow boy",
??? "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",Skills: []Skill{
            {Name: "",{Name: "Flash your dog eye"},
??? "Skills":[
??????? {
??????????? "level":1
??????? },
??????????? "level":0
??????? },
??????????? "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 前面的逗号不能省略

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读