函数一:json.Unmarshal

函数func json.Unmarshal(data []byte, v any) error就是用来解析json编码的data,然后将结果保存在指针v指向的值里。

首先根据json数据的格式定义struct,用来保存解码后的值。这里首先定义了一个user结构体,然后通过json.Unmarshal进行解码。

适合数据结构不复杂的,要是几十个的,光设置结构体也很麻烦。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package main

import (
"encoding/json"
"fmt"
)

type user struct {
Name string
Married bool
Address struct {
City string
Country string
}
}

func main() {
user1 := `{
"name": "tian",
"married": false,
"address": {
"city": "beijing",
"country": "China"
}
}`
user1Struct := &user{}
json.Unmarshal([]byte(user1), user1Struct)
fmt.Printf("解码后的结果为:%v", *user1Struct)
}

函数二:viper.ReadConfig

先下载一下go get -u github.com/spf13/viper

然后使用函数func viper.ReadConfig(in io.Reader) error读取数据并解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package main

import (
"fmt"
"strings"

"github.com/spf13/viper"
)

func main() {
user1 := `{
"name": "tian",
"married": false,
"address": {
"city": "beijing",
"country": "China"
}
}`
// 指定配置的类型为json
viper.SetConfigType("json")
// 读取数据
if err := viper.ReadConfig(strings.NewReader(user1)); err != nil {
fmt.Println(err)
}
fmt.Printf("数据的所有键值: %v\n", viper.AllKeys())
fmt.Printf("解析后的数据:%v\n", viper.AllSettings())
fmt.Printf("the type of \"married\" is %s\n", reflect.TypeOf(viper.Get("married")))
fmt.Printf("The name is %s and the country is %s\n", viper.Get("name"), viper.Get("address.country"))
}

首先要通过viper.SetConfigType("json")指定要解析数据的格式,否则即使viper.ReadConfig返回值没有报错,也得不到解析后的结果。
另外viper.Get()viper.GetString()viper.GetBool()等方法可以方便获取键值,同时对于键值的类型也能很好的判断。