结构体与json相互转换,map与json相互转换

目录
  1. 1. 一.结构体转json,使用json.Marshal()返回值([]byte, error)
  2. 2. 二.json转结构体,使用json.Unmarshal([]byte(string),*s)
  3. 3. 三.map转json
  4. 4. 四.json转map,数字默认为float64

一.结构体转json,使用json.Marshal()返回值([]byte, error)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package main

import (
"encoding/json"
"fmt"
)

type Student struct {
Name string
Age int
Gender byte
Subject []string
}

func main() {
s := Student{
"XiaoMing",
15,
'M',
[]string{"数学","语文","英语"},
}
sJson,err := json.Marshal(s)
if err!=nil{
fmt.Println(err)
return
}
fmt.Println("json of s = ",string(sJson))
}

运行结果:

1
json of s =  {"Name":"XiaoMing","Age":15,"Gender":77,"Subject":["数学","语文","英语"]}

二.json转结构体,使用json.Unmarshal([]byte(string),*s)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package main

import (
"encoding/json"
"fmt"
)

type Student struct {
Name string //`json:"-"` 字段转换成json时舍弃
Age int
Gender byte
Subject []string
}
func main() {
str := `{
"name":"李雷",
"age": "15",
"gender": 77,
"subject": [
"数学",
"语文",
"英语"
]
}`
s:= new(Student)
err := json.Unmarshal([]byte(str), &s)//第二个参数必须是指针
if err != nil{
fmt.Println(err)
return
}
fmt.Println(s)
}

运行结果:

1
{李雷 0 77 [数学 语文 英语]}

三.map转json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main

import (
"encoding/json"
"fmt"
)

func main() {
m := make(map[string]interface{})
m["name"] = "HanMeimei"
m["age"] = 11
m["gender"] = 'M'
m["subject"] = []string{"语文","数学","英语"}
fmt.Println("m = ",m)
mJson,err := json.Marshal(m)
if err!=nil {
fmt.Println(err)
return
}
fmt.Printf("mJson = %s",mJson)

}

运行结果:

1
2
m =  map[age:11 gender:77 name:HanMeimei subject:[语文 数学 英语]]
mJson = {"age":11,"gender":77,"name":"HanMeimei","subject":["语文","数学","英语"]}

四.json转map,数字默认为float64

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package main

import (
"encoding/json"
"fmt"
)

func main() {
mJson := `{"age":11,"gender":77,"name":"HanMeimei","subject":["语文","数学","英语"]}`
m:=make(map[string]interface{})
json.Unmarshal([]byte(mJson),&m)
fmt.Println(m)

// map值不能直接使用
// fmt.Println(m["company"])
// 报错:cannot use m["company"] (type interface {}) as type string in assignment: need type assertion
// 需要使用断言处理后才能使用
// fmt.Println(m["company"].(string))

//类型断言
for key,value := range m{
switch value.(type){
case string:
fmt.Printf("m[%s] = %s,type = string\n",key,value)
case int:
fmt.Printf("m[%s] = %d,type = int\n",key,value)
case float64:
fmt.Printf("m[%s] = %f,type = float64\n",key,value)
case []interface{}:
fmt.Printf("m[%s] = %s,type = []interface{}\n",key,value)
case byte:
fmt.Printf("m[%s] = %s,type = byte\n",key,value)
}
}
}

运行结果:

1
2
3
4
5
map[age:11 gender:77 name:HanMeimei subject:[语文 数学 英语]]
m[name] = HanMeimei,type = string
m[subject] = [语文 数学 英语],type = []interface{}
m[age] = 11.000000,type = float64
m[gender] = 77.000000,type = float64