脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Golang - Golang中Json的序列化和反序列化的使用

Golang中Json的序列化和反序列化的使用

2022-09-26 12:26itzhuzhu. Golang

本文主要介绍了Golang中Json的序列化和反序列化的使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

 JSON:

  • JSON(JavaScript Object Notation):是一种轻量级的数据交换格式。 它是基于 ECMAScript 规范的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。
  • 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。易于人阅读和编写,同时也易于计算机解析和生成,并有效的 提升网络传输效率。
  • Json易于机器解析和生成,并有效的提升网络传输效率,通常程序传输时会先将数据序列化成json字符串,接收方再反序列化成原数据类型
  • 所有的数据类型都可以通过Json表示
  • Json.cn这个网站可以验证Json格式
  • 序列化用json.Marshal()
  • 反序列化用json.Unmarshal(),反序列化时要和序列化前的数据类型保持一致

创建格式:

Golang中Json的序列化和反序列化的使用

基本数据类型序列化:

?
1
2
3
4
5
6
7
8
func testBasic() {
    num := 1.111
    marshal, err := json.Marshal(num)
    if err != nil {
        fmt.Println("json.Marshal err:", err)
    }
    fmt.Println("序列化后:", string(marshal)) // 序列化后: 1.111
}

结构体序列化:

?
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
func main() {
    testStudent()
}
/**
type Student struct {
    Name     string
    Age      int
    Birthday string
    Address  string
}
*/
// 如果加上`json:"student_name"`,序列化以后的数据字段是返回指定格式的,可以小写,json固定,后面的随意
type Student struct {
    // 变量首字母大写才能被解析
    Name     string `json:"student_name"`
    Age      int    `json:"student_age"`
    Birthday string `json:"student_birthday"`
    Address  string `json:"student_address"`
}
 
 
func testStudent() {
    student := Student{
        Name:     "itzhuzhu",
        Age:      24,
        Birthday: "1998-01-01",
        Address:  "广州市天河区",
    }
    marshal, err := json.Marshal(&student)
    if err != nil {
        fmt.Println("json.Marshal err:", err)
    }
    fmt.Println("序列化后:", string(marshal)) // 序列化后:{"Name":"itzhuzhu","Age":24,"Birthday":"1998-01-01","Address":"广州市天河区"}
}

map序列化:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
func testMap() {
    var m map[string]interface{}
    m = make(map[string]interface{})
    m["name"] = "韩信"
    m["age"] = 23
    m["address"] = "广州"
 
    marshal, err := json.Marshal(m)
    if err != nil {
        fmt.Println("json.Marshal err:", err)
    }
    fmt.Println("序列化后:", string(marshal)) // 序列化后: {"address":"广州","age":23,"name":"韩信"}
}

切片序列化:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
func testSlice() {
    var slice []map[string]interface{}
    var m map[string]interface{}
    m = make(map[string]interface{})
    m["name"] = "韩信"
    m["age"] = 23
    m["address"] = "广州"
    slice = append(slice, m)
    marshal, err := json.Marshal(m)
    if err != nil {
        fmt.Println("json.Marshal err:", err)
    }
    fmt.Println("序列化后:", string(marshal)) // 序列化后: {"address":"广州","age":23,"name":"韩信"}
}

反序列化为结构体:

?
1
2
3
4
5
6
7
8
9
10
11
12
func deserialize() {
    str := "{\"Name\":\"itzhuzhu\",\"Age\":24,\"Birthday\":\"1998-01-01\",\"Address\":\"广州市天河区\"}"
 
    // 使用Unmarshal反序列化
    var student Student
    err := json.Unmarshal([]byte(str), &student)
    if err != nil {
        fmt.Println("json.Unmarshal err:", err)
    }
 
    fmt.Println("反序列化后:", student) // 反序列化后: {itzhuzhu 24 1998-01-01 广州市天河区}
}

反序列化为map:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
func deserializeMap() {
    str := " {\"address\":\"广州\",\"age\":23,\"name\":\"韩信\"}"
 
    // 反序列化的时候不需要make,被封装到Unmarshal中了
    var m map[string]interface{}
 
    err := json.Unmarshal([]byte(str), &m)
    if err != nil {
        fmt.Println("json.Unmarshal err:", err)
    }
 
    fmt.Println("反序列化后:", m) // map[address:广州 age:23 name:韩信]
}

反序列化为切片:

?
1
2
3
4
5
6
7
8
9
10
11
12
func deserializeSlice() {
    str := " [{\"address\":\"广州\",\"age\":23,\"name\":\"韩信\"}]"
 
    var slice []map[string]interface{}
 
    err := json.Unmarshal([]byte(str), &slice)
    if err != nil {
        fmt.Println("json.Unmarshal err:", err)
    }
 
    fmt.Println("反序列化后:", slice) // 反序列化后: [map[address:广州 age:23 name:韩信]]
}

到此这篇关于Golang中Json的序列化和反序列化的使用的文章就介绍到这了,更多相关Golang Json序列化和反序列化内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_45477086/article/details/123038220

延伸 · 阅读

精彩推荐
  • Golang浅谈Go切片的值修改是否会覆盖数组的值

    浅谈Go切片的值修改是否会覆盖数组的值

    本文主要介绍了浅谈Go切片的值修改是否会覆盖数组的值,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 ...

    wichandy7082022-09-02
  • Golanggolang替换无法显示的特殊字符(\u0000, \000, ^@)

    golang替换无法显示的特殊字符(\u0000, \000, ^@)

    这篇文章主要介绍了golang替换无法显示的特殊字符,包括的字符有\u0000, \000, ^@等,下文详细资料,需要的小伙伴可以参考一下...

    sndapk8302022-09-24
  • GolangGo语言中的上下文取消操作详解

    Go语言中的上下文取消操作详解

    这篇文章主要给大家介绍了关于Go语言中上下文取消操作的相关资料,本文将解释我们如何利用上下文库的取消特性,并通过一些模式和最佳实践来使用取...

    HULK一线技术杂谈4892020-05-16
  • GolangGolang 处理浮点数遇到的精度问题(使用decimal)

    Golang 处理浮点数遇到的精度问题(使用decimal)

    本文主要介绍了Golang 处理浮点数遇到的精度问题,不使用decimal会出大问题,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们...

    头秃猫轻王3962022-09-04
  • Golanggo语言开发环境配置(sublime text3+gosublime)

    go语言开发环境配置(sublime text3+gosublime)

    网上google了下go的开发工具,大都推荐sublime text3+gosublime,本文就介绍了go语言开发环境配置(sublime text3+gosublime),具有一定的参考价值,感兴趣的可以了解一...

    北京雨夜10692022-01-26
  • Golanggolang Gin上传文件返回前端及中间件实现示例

    golang Gin上传文件返回前端及中间件实现示例

    这篇文章主要为大家介绍了golang Gin上传文件返回前端及中间件实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪...

    Jeff的技术栈6412022-09-19
  • GolangGolang 语言高效使用字符串的方法

    Golang 语言高效使用字符串的方法

    这篇文章主要介绍了Golang 语言高效使用字符串的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋...

    Golang语言开发栈7642021-04-23
  • Golanggoland 恢复已更改文件的操作

    goland 恢复已更改文件的操作

    这篇文章主要介绍了goland 恢复已更改文件的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    疯狂学者10892021-06-05