Go 语言入门很简单 – Go 语言转化为 JSON

在日常工作中,除了需要从 JSON 转化为 Go 的数据结构。但往往相反的情况是:我们需要将数据以 JSON 字符串的形式发送到 Web 服务器。今天我们将学会如何从一个结构化数据编码为 JSON 。

结构体转为 JSON 格式

比如,我们有如下的结构体:

type Student struct {
    Name string
    Age int
    Address Address
}

type Address struct {
    Road string
    Street string
    City string
    Province string
    Country string
}

Zhang3 := Student{
        Name: "张三",
        Age:  18,
        Address: Address{
            Road:     "renmin south road",
            Street:   "123 street",
            City:     "cs",
            Province: "hn",
            Country:  "CN",
        },
    }
json.Marshl()
Info_of_Zhang3, err := json.Marshal(Zhang3)
if err == nil {
    fmt.Println(string(Info_of_Zhang3))
} else {
    fmt.Println(err)
    return
}
Marshal()

完整代码如下:

package main

import (
    "encoding/json"
    "fmt"
)

type Student struct {
    Name    string
    Age     int
    Address Address
}

type Address struct {
    Road     string
    Street   string
    City     string
    Province string
    Country  string
}

func main() {

    Zhang3 := Student{
        Name: "张三",
        Age:  18,
        Address: Address{
            Road:     "renmin south road",
            Street:   "123 street",
            City:     "cs",
            Province: "hn",
            Country:  "CN",
        },
    }

    Info_of_Zhang3, err := json.Marshal(Zhang3)
    if err == nil {
        fmt.Println(string(Info_of_Zhang3))
    } else {
        fmt.Println(err)
        return
    }

}

运行代码,得到如下 JSON 数据结果:

$ go run main.go
{"Name":"张三","Age":18,"Address":{"Road":"renmin south road","Street":"123 street","City":"cs","Province":"hn","Country":"CN"}}
json. MarshalIndent()

比如,使用如下语句:

Info_of_Zhang3, err := json.MarshalIndent(Zhang3, "", "    ")
json.MarshalIndent(Zhang3, "", " ")
{
    "Name": "张三",
    "Age": 18,
    "Address": {
        "Road": "renmin south road",
        "Street": "123 street",
        "City": "cs",
        "Province": "hn",
        "Country": "CN"
    }
}

接口转为 JSON 格式

有时您并不希望固定结构中的字段数量。 相反,您希望能够在需要的时候添加额外的数据。您可以使用空接口来实现这一点,如下所示:

type Student map[string] interface{}
type Address map[string] interface{}

使用空接口,可以创建自己的 Student 变量,还可以添加想要的元素,就像这样:

Zhang3 := Student{
    "Name": "张三",
    "Age": 18,
    "Address": Address{
        "Road": "renmin south road",
        "Street": "123 street",
        "City": "cs",
        "Province": "hn",
        "Country": "CN",
    },
    "Year": 2022,    // 新增学年
}

完整代码如下:

package main

import (
    "encoding/json"
    "fmt"
)

type Student map[string]interface{}
type Address map[string]interface{}

func main() {
    Zhang3 := Student{
        "Name": "张三",
        "Age":  18,
        "Address": Address{
            "Road":     "renmin south road",
            "Street":   "123 street",
            "City":     "cs",
            "Province": "hn",
            "Country":  "CN",
        },
        "Year":       2022, // 新增学年
        "GraduateAt": 2026, // 毕业年份
    }

    InfoOfZhang3, err := json.MarshalIndent(Zhang3, "", "    ")
    if err == nil {
        fmt.Println(string(InfoOfZhang3))
    } else {
        fmt.Println(err)
    }
}

代码输出结果为:

{
    "Address": {
        "City": "cs",
        "Country": "CN",
        "Province": "hn",
        "Road": "renmin south road",
        "Street": "123 street"
    },
    "Age": 18,
    "GraduateAt": 2026,
    "Name": "张三",
    "Year": 2022
}

同时我们能看到输出的 JSON 中的键的顺序是按字母排序的。

Marshal() 函数的原型

我们看一下 Marshal 函数:

func Marshal(v interface{}) ([]byte, error) {
   e := newEncodeState()

   err := e.marshal(v, encOpts{escapeHTML: true})
   if err != nil {
      return nil, err
   }
   buf := append([]byte(nil), e.Bytes()...)

   e.Reset()
   encodeStatePool.Put(e)

   return buf, nil
}
err == nilmap[string]TTencoding/json

总结

Unmarshal
Marshal()
encoding/jsonEncode()Decode()Marshal()Unmarshal()

其实,本文只是简单的介绍了 Go 语言和 JSON 数据在控制台的简单转化,等后续的文章介绍了文件读取和写入时,就可以学会与 JSON 文件打交道了。敬请期待!

这里是宇宙之一粟,一个头发比想法还多的外企打工仔!如果喜欢我的文章,关注我,点个赞,让我知道你的存在,谢谢!2022,一起加油~

原网址: 访问
创建于: 2022-08-17 21:59:45
目录: default
标签: 无