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 }