函数一: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" } }` 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()
等方法可以方便获取键值,同时对于键值的类型也能很好的判断。