type Student struct {
Name string `json:"name"`
IdNum int `json:"id"`
}
type MyConfig struct {
Header map[string]string `json:"header"`
Header1 map[string]Student `json:"header1"`
Port int `json:"port"`
}
func main() {
// 普通结构体转json字符串
s := Student{
Name: "小红",
IdNum: 5,
}
jsonData, _ := json.Marshal(s)
fmt.Println(string(jsonData))
// 普通结构体数组转json字符串
ary := make([]Student, 2)
ary[0].Name = "小红"
ary[0].IdNum = 1
ary[1].Name = "小明"
ary[1].IdNum = 2
jsonData, _ = json.Marshal(ary)
fmt.Println(string(jsonData))
// Map结构转json字符串
data := make(map[string]interface{}, 1)
data["cmd"] = 1
data["data"] = ary
data["student"] = s
jsonData, _ = json.Marshal(data)
fmt.Println(string(jsonData))
// 复杂结构体转json字符串
config := MyConfig{}
config.Header = make(map[string]string, 20)
config.Header1 = make(map[string]Student, 20)
config.Header["name1"] = "小明"
config.Header1["name2"] = s
config.Port = 1000
jsonData, _ = json.Marshal(config)
fmt.Println(string(jsonData))
// json字符串转结构体
jsonData, _ = json.Marshal(s)
s1 := Student{}
json.Unmarshal(jsonData, &s1)
// json字符串转结构体数组
jsonData, _ = json.Marshal(ary)
ary2 := make([]Student, 0)
json.Unmarshal(jsonData, &ary2)
// json字符串转复杂结构体方法1
config1 := MyConfig{}
config1.Header = make(map[string]string, 0)
config1.Header1 = make(map[string]Student, 0)
jsonData, _ = json.Marshal(config)
var headerInterface map[string]interface{}
json.Unmarshal(jsonData, &headerInterface)
header, ok := headerInterface["header"].(map[string]interface{})
if ok {
for k, v := range header {
value := v.(string)
config1.Header[k] = value
}
} else {
fmt.Println("json解析Header出错")
}
header1, ok := headerInterface["header1"].(map[string]interface{})
if ok {
for k, v := range header1 {
if t, myok := v.(Student); myok {
fmt.Println("v isStudent %T", t)
}
s3 := Student{}
if h, myok := v.(map[string]interface{}); myok {
fmt.Println("v map[string]interface{}")
for k1, v1 := range h {
if k1 == "name" {
s3.Name = v1.(string)
} else if k1 == "id" {
s3.IdNum = (int)(v1.(float64))
}
}
config1.Header1[k] = s3
}
}
} else {
fmt.Println("json解析Header出错")
}
port, ok := headerInterface["port"].(float64)
if ok {
config1.Port = (int)(port)
} else {
fmt.Println("json解析Header出错")
}
// json字符串转复杂结构体方法2
jsonData, _ = json.Marshal(config1)
s3 := MyConfig{}
json.Unmarshal(jsonData, &s3)
fmt.Printf("%s", s3.Header1["name2"].Name)
}
运行结果
API server listening at: 127.0.0.1:60266
{"name":"小红","id":5}
[{"name":"小红","id":1},{"name":"小明","id":2}]
{"cmd":1,"data":[{"name":"小红","id":1},{"name":"小明","id":2}],"student":{"name":"小红","id":5}}
{"header":{"name1":"小明"},"header1":{"name2":{"name":"小红","id":5}},"port":1000}
v map[string]interface{}
小红