当你遇到一串json字符串,想要解析到map或者自定义结构体中使用时,可以尝试以下方法:
1.解析到map:将目标json字符串转换成一个map[string]interface{}类型的数据
2.解析到struct结构体:定义一个结构体,将数据转换成对应的结构体对象,再获取相应的数据
package main
import (
"fmt"
"encoding/json"
)
// 1.解析到map:将目标json字符串转换成一个map[string]interface{}类型的数据
func UnmarshalJsonStr() {
userInfo := `{"Name":"Bill","Age": 25}` // 示例:json格式字符串 (两边反引号`)
m := make(map[string]interface{})
if err := json.Unmarshal([]byte(userInfo), &m); err != nil {
fmt.Println("JsonDecodeFun json.Unmarshal faild.")
return
}
for k, v := range m {
fmt.Println("key:", k, " value:", v) // key: Name value: Bill key: Age value: 25
}
}
// 2.解析到结构体:定义一个结构体,将数据转换成对应的结构体对象,再获取相应的数据
// 将JSON数据绑定到结构体中,结构体中字段名首字母要大写,不然不能正确绑定数据
type User struct {
Name string `json:"name"` // `json:"xxx"`:在结构体和json字符串字段顺序不一致的情况下:json.unmarshal根据tag去寻找对应字段的内容
Sex string `json:"sex"`
Age int `json:"age"`
}
func UnmarshalJsonStr1() {
userInfo := `{
"sex":"male", // 此处sex和name故意与结构体字段顺序相反,证明解析时是通过tag解析对应字段信息的
"name":"Bill",
"age":25
}`
var u User
err := json.Unmarshal([]byte(userInfo), &u) // 反序列化
if err != nil {
fmt.Println("err was %v", err)
}
fmt.Printf("%+v\n", u) // {Name:Bill Sex:male Age:25}
fmt.Println(u.Name, u.Sex, u.Age) // Bill male 25
}
func main() {
UnmarshalJsonStr()
UnmarshalJsonStr1()
return
}