一、map、struct、json 的互相转换
1、struct 转 json
package main
import (
"encoding/json"
"fmt"
)
type Demo struct {
Akey string
Bkey int
}
func main() {
// todo struct转json
demo := Demo{Akey:"a", Bkey:1}
jsons, errs := json.Marshal(demo) //转换成JSON返回的是byte[]
if errs != nil {
fmt.Println(errs.Error())
}
fmt.Println(string(jsons)) //byte[]转换成string 输出
}
2、json 转 struct
package main
import (
"fmt"
"encoding/json"
)
type Demo struct {
Akey string
Bkey int
}
func main() {
// todo json转struct
jsons :=`{"Akey":"a","Bkey":1}`
var demo_s Demo
errs :=json.Unmarshal([]byte(jsons), &demo_s)
if errs != nil {
fmt.Println(errs.Error())
}
fmt.Println(demo_s)
}
3、map 转 json
package main
import (
"fmt"
"encoding/json"
)
func main() {
// todo map转json
demoMap := map[string]interface{}{"Akey":"a", "Bkey":1}
jsons, errs := json.Marshal(demoMap) //转换成JSON返回的是byte[]
if errs != nil {
fmt.Println(errs.Error())
}
fmt.Println(string(jsons)) //byte[]转换成string 输出
}
4、 json 转 map
package main
import (
"fmt"
"encoding/json"
)
func main() {
// todo json转map
var demoMap map[string]interface{}
jsons :=`{"Akey":"a","Bkey":1}`
errs :=json.Unmarshal([]byte(jsons), &demoMap)
if errs != nil {
fmt.Println(errs.Error())
}
fmt.Println(demoMap)
}
5、map 转 struct(或:map 转 json,json 转 struct)
package main
import (
"fmt"
"github.com/goinggo/mapstructure"
)
type Demo struct {
Akey string
Bkey int
}
func main() {
// todo map转struct(map转json,json转struct)
demoMap := map[string]interface{}{"Akey":"a", "Bkey":1}
var demo Demo
err := mapstructure.Decode(demoMap, &demo)
if err != nil {
fmt.Println(err)
}
fmt.Println(demo)
}
6、struct 转 map(或:struct 转 json, json 转 map)
package main
import (
"fmt"
"reflect"
)
type Demo struct {
Akey string
Bkey int
}
func main() {
// todo struct转map(struct转json, json转map)
demo := Demo{Akey:"a", Bkey:1}
demoMap := make(map[string]interface{})
elem := reflect.ValueOf(&demo).Elem() // value的list
relType := elem.Type() // key的list
for i := 0; i < relType.NumField(); i++ {
demoMap[relType.Field(i).Name] = elem.Field(i).Interface()
}
fmt.Println(demoMap)
}
二、类型断言
1、复合类型的 map
如果我们需要定义一个 map,但是这个 map 的 value 即有 string 类型,又有 int 类型,及其他类型该怎么办?直接看代码
comMap := map[string]interface{}{} comMap["Akey"] = "hello" comMap["Bkey"] = 100 fmt.Println(comMap)
2、类型断言
我们定义了一个复合类型 map,然后对 map 中的一个 value 进行 byte 转换,如下代码,运行报错,是因为 comT 变量类型没确定,看第二个例子
// 运行报错
package main
import "fmt"
func main() {
comMap := map[string]interface{}{"t":`[{"a":1},{"b":"c"}]`}
comT := comMap["t"]
fmt.Println([]byte(comT))
}
使用 comT.(string),来判断 comT 是否为 string,是的话,ok 变量为 true,result 指代 comT 变量的值,result 变量类型确定,可以使用[]byte(result)方法,将 result 转为字节了
// 运行通过
package main
import "fmt"
func main() {
comMap := map[string]interface{}{"t":`[{"a":1},{"b":"c"}]`}
comT := comMap["t"]
result, ok := comT.(string)
if ok{
fmt.Println([]byte(result))
}
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于