Golang-Json序列化和反序列化

json 的序列化介绍
    json 序列化是指,将有 key-value 结构的数据类型(比如结构体、map、切片)序列化成 json 字符串的操作。
应用案例
    这里我们介绍一下结构体、map 和切片的序列化,其它数据类型的序列化类似。
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package main
import (
    "fmt"
    "encoding/json"
)
     
//定义一个结构体
type Monster struct {
    Name string
    Age int
    Birthday string
    Sal float64
    Skill string
}
     
func testStruct() {
    //演示
    monster := Monster{
        Name :"牛魔王", Age : 500,
        Birthday : "2011-11-11",
        Sal : 8000.0,
        Skill : "牛魔拳",
    }
    //将 monster 序列化
    data, err := json.Marshal(&monster)
    if err != nil {
        fmt.Printf("序列号错误 err=%v\n", err)
    }
    //输出序列化后的结果
    fmt.Printf("monster 序列化后=%v\n", string(data))
     
}
//将 map 进行序列化
func testMap() {
    //定义一个 map
    var a map[string]interface{}
    //使用 map,需要 make
    a = make(map[string]interface{}) a["name"] = "红孩儿"
    a["age"] = 30
    a["address"] = "洪崖洞"
     
    //将 a 这个 map 进行序列化
    //将 monster 序列化
    data, err := json.Marshal(a)
    if err != nil {
        fmt.Printf("序列化错误 err=%v\n", err)
    }
    //输出序列化后的结果
    fmt.Printf("a map  序列化后=%v\n", string(data))
 
}
//演示对切片进行序列化, 我们这个切片 []map[string]interface{}
func testSlice() {
    var slice []map[string]interface{}
    var m1 map[string]interface{}
    //使用 map 前,需要先 make
    m1 = make(map[string]interface{}) m1["name"] = "jack"
    m1["age"] = "7"
    m1["address"] = "北京"
    slice = append(slice, m1)
     
    var m2 map[string]interface{}
    //使用 map 前,需要先 make
    m2 = make(map[string]interface{})
    m2["name"] = "tom"
    m2["age"] = "20"
    m2["address"] = [2]string{"墨西哥","夏威夷"}
    slice = append(slice, m2)
 
    //将切片进行序列化操作
    data, err := json.Marshal(slice)
    if err != nil {
        fmt.Printf("序列化错误 err=%v\n", err)
    }
    //输出序列化后的结果
    fmt.Printf("slice 序列化后=%v\n", string(data))
 
}
//对基本数据类型序列化,对基本数据类型进行序列化意义不大
func testFloat64() {
    var num1 float64 = 2345.67
 
    //对 num1 进行序列化
    data, err := json.Marshal(num1)
    if err != nil {
        fmt.Printf("序列化错误 err=%v\n", err)
    }
    //输出序列化后的结果
    fmt.Printf("num1 序列化后=%v\n", string(data))
}
 
func main() {
    //演示将结构体, map , 切片进行序列号
    testStruct() testMap()
    testSlice()//演示对切片的序列化
    testFloat64()//演示对基本数据类型的序列化
}
    

 

注意事项
  对于结构体的序列化,如果我们希望序列化后的key 的名字,又我们自己重新制定,那么可以给struct指定一个 tag 标签.
  

  序列化后:
  {"monster_name":"牛魔王","monster_age":500,"Birthday":"2011-11-11","Sal":8000,"Skill":"牛魔拳"}

 

json 的反序列化基本介绍

  json 反序列化是指,将 json 字符串反序列化成对应的数据类型(比如结构体、map、切片)的操作
  应用案例
  这里我们介绍一下将 json 字符串反序列化成结构体、map 和切片代码演示:

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
package main
import (
    "fmt"
    "encoding/json"
)
     
//定义一个结构体
type Monster struct {
    Name string Age int
    Birthday string //....
    Sal float64 Skill string
}
     
//演示将 json 字符串,反序列化成 struct
func unmarshalStruct() {
    //说明 str 在项目开发中,是通过网络传输获取到.. 或者是读取文件获取到
    str := "{\"Name\":\"牛魔王\",\"Age\":500,\"Birthday\":\"2011-11-11\",\"Sal\":8000,\"Skill\":\"牛魔拳\"}"
     
    //定义一个 Monster 实例
    var monster Monster
    err := json.Unmarshal([]byte(str), &monster)
    if err != nil {
        fmt.Printf("unmarshal err=%v\n", err)
    }
    fmt.Printf("反序列化后 monster=%v monster.Name=%v \n", monster, monster.Name)
     
}
//演示将 json 字符串,反序列化成 map
func unmarshalMap() {
    str := "{\"address\":\"洪崖洞\",\"age\":30,\"name\":\"红孩儿\"}"
     
    //定义一个 map
    var a map[string]interface{}
     
    //反序列化
    //注意:反序列化 map,不需要 make,因为 make 操作被封装到 Unmarshal 函数
    err := json.Unmarshal([]byte(str), &a)
    if err != nil {
        fmt.Printf("unmarshal err=%v\n", err)
    }
    fmt.Printf("反序列化后 a=%v\n", a)
     
}
//演示将 json 字符串,反序列化成切片
func unmarshalSlice() {
    str := "[{\"address\":\"北京\",\"age\":\"7\",\"name\":\"jack\"}," +
    "{\"address\":[\"墨西哥\",\"夏威夷\"],\"age\":\"20\",\"name\":\"tom\"}]"
     
    //定义一个 slice
    var slice []map[string]interface{}
    //反序列化,不需要 make,因为 make 操作被封装到 Unmarshal 函数
    err := json.Unmarshal([]byte(str), &slice)
    if err != nil {
        fmt.Printf("unmarshal err=%v\n", err)
    }
    fmt.Printf("反序列化后 slice=%v\n", slice)
}
     
func main() {
     
    unmarshalStruct()
    unmarshalMap()
    unmarshalSlice()
}

  对上面代码的小结说明
  1)在反序列化一个json 字符串时,要确保反序列化后的数据类型和原来序列化前的数据类型一致。

posted @   爱跑步的乌龟  阅读(3072)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示