Go中Json、Map、Struct互转
这个本来想放到snippet里面的,不过还是有点代码 所以单独放出来吧
package main
import (
"encoding/json"
"fmt"
"github.com/goinggo/mapstructure"
"reflect"
)
// json map struct 互转
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
//Json
jsonStr := `{"name":"zhangsan","age":12}` // json字符串大小写不敏感
// Json To Struct
var person Person
json.Unmarshal([]byte(jsonStr), &person)
fmt.Println(person) //{zhangsan 12}
//Json To Map
var mapResult map[string]interface{}
json.Unmarshal([]byte(jsonStr), &mapResult)
fmt.Println(mapResult) //map[age:12 name:zhangsan]
//Struct
p := Person{"ZhangSan", 30}
// Struct To Json
jsonBytes, _ := json.Marshal(p)
fmt.Printf(string(jsonBytes)) //{"name":"ZhangSan","age":30}
//Struct To Map 或者引用三方类库
fmt.Println(StructToMap(p))
//Map
m := make(map[string]interface{})
m["Name"] = "WangWu"
m["Age"] = 20
//Map To Json
jsonStr2, _ := json.Marshal(m)
fmt.Println(string(jsonStr2)) //{"Age":20,"Name":"WangWu"}
//Map To Struct 这个一般使用三方类库
var p2 Person
mapstructure.Decode(m, &p2)
fmt.Println(p2) //{WangWu 20}
}
func StructToMap(obj interface{}) map[string]interface{} {
t := reflect.TypeOf(obj)
v := reflect.ValueOf(obj)
var data = make(map[string]interface{})
for i := 0; i < t.NumField(); i++ {
data[t.Field(i).Name] = v.Field(i).Interface()
}
return data
}
