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

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

服务器之家 - 脚本之家 - Golang - GoLang之标准库encoding/json包

GoLang之标准库encoding/json包

2022-08-17 14:33GoGo在努力 Golang

本文主要介绍了GoLang之标准库encoding/json包,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

注:本文以Windos系统上Go SDK v1.8进行讲解

1.JSON介绍

在进行前后分离式开发时,json显得格外的重要,因为他是链接前后台重要的枢纽
json是储存和交换文本信息的语法,他类似于xml,但是他比xml更加的便捷,快速,易于解析。主要使用场景就是作为前后台数据交互的枢纽,以下是一个简单json的格式:
JSON: JavaScript Object Notation(JavaScript 对象标记法)。
JSON 是一种存储和交换数据的语法。
JSON 是通过 JavaScript 对象标记法书写的文本。
当数据在浏览器与服务器之间进行交换时,这些数据只能是文本。
JSON 属于文本,并且我们能够把任何 JavaScript 对象转换为 JSON,然后将 JSON 发送到服务器。
我们也能把从服务器接收到的任何 JSON 转换为 JavaScript 对象。
以这样的方式,我们能够把数据作为 JavaScript 对象来处理,无需复杂的解析和转译。
JSON 使用 JavaScript 语法,但是 JSON 格式是纯文本的。
文本可被任何编程语言作为数据来读取和使用。
JSON 格式最初由 Douglas Crockford 提出。
因为 JSON 格式仅仅是文本,它能够轻松地在服务器浏览器之间传输,并用作任何编程语言的数据格式。
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。JSON键值对是用来保存JS对象的一种方式,键/值对组合中的键名写在前面并用双引号""包裹,使用冒号:分隔,然后紧接着值;多个键值之间使用英文,分隔

2.JSON序列化、反序列化介绍

json的序列化与反序列化介绍:
那么在说明如何解析Json和XML之前,我们先来搞清楚两个概念:序列化和反序列化。
序列化,即Serialization,是一个将对象的状态信息转变为可以存储或传输的形式的过程。
反序列化,即Deserialization,顾名思义是一个将可以存储或传输的序列转变为某个对象的状态信息的过程。
1.这两个过程互为逆过程;
2.无论是序列化还是反序列化,对象的状态信息都与一段序列相对应。

3.encoding/json包介绍

GoLang之标准库encoding/json包

4.Marshal函数

GoLang之标准库encoding/json包

?
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
//Student 学生
type Student struct {
    ID     int
    Gender string
    Name   string
}
 
//Class 班级
type Class struct {
    Title    string
    Students []Student
}
 
//student的构造函数
func newStudent(id int, name string) Student {
    return Student{
        ID:   id,
        Name: name,
    }
}
func main() {
    //创建了一个班级变量
    c1 := Class{
        Title:    "101",
        Students: make([]Student, 0, 200),
    }
    //往班级变量中添加学生
 
    for i := 0; i < 10; i++ {
        tmpStu := newStudent(i, fmt.Sprintf("stu%02d,", i))
        c1.Students = append(c1.Students, tmpStu)
    }
    fmt.Println(c1)
    //输出:{101 [{0  stu00,} {1  stu01,} {2  stu02,} {3  stu03,} {4  stu04,} {5  stu05,} {6  stu06,} {7  stu07,} {8  stu08,} {9  stu09,}]}
    //JSON序列化:结构体转化为JSON格式的字符串
    data, err := json.Marshal(c1)
    if err != nil {
        fmt.Println("json marshal failed")
        return
    }
    fmt.Printf("%T\n", data) //[]uint8
    //fmt.Println(data)//尽量不要采用这样的方式
    fmt.Println(string(data))
    /*输出:{"Title":"101","Students":[{"ID":0,"Gender":"","Name":"stu00,"},{"ID":1,"Gender":"","Name":"stu01,"},{"ID":2,"Gender":"","Name":"stu02,"},
    {"ID":3,"Gender":"","Name":"stu03,"},{"ID":4,"Gender":"","Name":"stu04,"},{"ID":5,"Gender":"", "Name":"stu05,"},{"ID":6,"Gender":"","Name":"stu06,"},
    {"ID":7,"Gender":"","Name":"stu07,"},{"ID":8,"Gender":"","Name":"stu08,"},{"ID":9,"Gender":"","Name":"stu09,"}]}*/
}
 
//大写例子
?
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
package main
 
import (
    "encoding/json"
    "fmt"
)
 
//Student 学生
type Student struct {
    ID     int
    Gender string
    Name   string
}
 
//Class 班级
type Class struct {
    title    string
    Students []Student
}
 
//student的构造函数
func newStudent(id int, name string) Student {
    return Student{
        ID:   id,
        Name: name,
    }
}
func main() {
    //创建了一个班级变量
    c1 := Class{
        title:    "101",
        Students: make([]Student, 0, 200),
    }
    //往班级变量中添加学生
 
    for i := 0; i < 10; i++ {
        tmpStu := newStudent(i, fmt.Sprintf("stu%02d,", i))
        c1.Students = append(c1.Students, tmpStu)
    }
    fmt.Println(c1)
    //输出:{101 [{0  stu00,} {1  stu01,} {2  stu02,} {3  stu03,} {4  stu04,} {5  stu05,} {6  stu06,} {7  stu07,} {8  stu08,} {9  stu09,}]}
    //JSON序列化:结构体转化为JSON格式的字符串
    data, err := json.Marshal(c1)
    if err != nil {
        fmt.Println("json marshal failed")
        return
    }
    fmt.Printf("%T\n", data) //[]uint8
    //fmt.Println(data)//尽量不要采用这样的方式
    fmt.Println(string(data))
    /*输出:{"Students":[{"ID":0,"Gender":"","Name":"stu00,"},{"ID":1,"Gender":"","Name":"stu01,"},{"ID":2,"Gender":"","Name":"stu02,"},
      {"ID":3,"Gender":"","Name":"stu03,"},{"ID":4,"Gender":"","Name":"stu04,"},{"ID":5,"Gender":"", "Name":"stu05,"},{"ID":6,"Gender":"","Name":"stu06,"},
      {"ID":7,"Gender":"","Name":"stu07,"},{"ID":8,"Gender":"","Name":"stu08,"},{"ID":9,"Gender":"","Name":"stu09,"}]}*/
}
 
//小写例子,json包不能看到小写字段的,所以小写字段的不会被序列化

5.Umarshal函数 

GoLang之标准库encoding/json包

?
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
//Student 学生
type Student struct {
    ID     int
    Gender string
    Name   string
}
//Class 班级
type Class struct {
    Title    string
    Students []Student
}
//student的构造函数
func newStudent(id int, name string) Student {
    return Student{
        ID:   id,
        Name: name,
    }
}
func main() {
    //JSON反序列化:JSON格式的字符串转化为结构体
    var c1 Class
    //str的内容使用反引号来标注的``
    str := `{"Title":"101","Students":[{"ID":0,"Gender":"男","Name":"stu00"},{"ID":1,"Gender":"男","Name":"stu01"},{"ID":2,"Gender":"男","Name":"stu02"},{"ID":3,"Gender":"男","Name":"stu03"},{"ID":4,"Gender":"男","Name":"stu04"},{"ID":5,"Gender":"男","Name":"stu05"},{"ID":6,"Gender":"男","Name":"stu06"},{"ID":7,"Gender":"男","Name":"stu07"},{"ID":8,"Gender":"男","Name":"stu08"},{"ID":9,"Gender":"男","Name":"stu09"}]}`
    err := json.Unmarshal([]byte(str), &c1) //第二个参数用来存放第一个参数的内容,c2需要被修改,想要被需改成功必须得传入指针
    if err != nil {
        fmt.Println("json unmarshal failed!")
        return
    }
    fmt.Println(c1)
    //输出:{101 [{0 男 stu00} {1 男 stu01} {2 男 stu02} {3 男 stu03} {4 男 stu04} {5 男 stu05} {6 男 stu06} {7 男 stu07} {8 男 stu08} {9 男 stu09}]}
}
//结构体大写例子
?
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
//Student 学生
type Student struct {
    ID     int
    Gender string
    Name   string
}
//Class 班级
type Class struct {
    title    string
    Students []Student
}
//student的构造函数
func newStudent(id int, name string) Student {
    return Student{
        ID:   id,
        Name: name,
    }
}
func main() {
    //JSON反序列化:JSON格式的字符串转化为结构体
    var c1 Class
    //str的内容使用反引号来标注的``
    str := `{"title":"101","Students":[{"ID":0,"Gender":"男","Name":"stu00"},{"ID":1,"Gender":"男","Name":"stu01"},{"ID":2,"Gender":"男","Name":"stu02"},{"ID":3,"Gender":"男","Name":"stu03"},{"ID":4,"Gender":"男","Name":"stu04"},{"ID":5,"Gender":"男","Name":"stu05"},{"ID":6,"Gender":"男","Name":"stu06"},{"ID":7,"Gender":"男","Name":"stu07"},{"ID":8,"Gender":"男","Name":"stu08"},{"ID":9,"Gender":"男","Name":"stu09"}]}`
    err := json.Unmarshal([]byte(str), &c1) //第二个参数用来存放第一个参数的内容,c2需要被修改,想要被需改成功必须得传入指针
    if err != nil {
        fmt.Println("json unmarshal failed!")
        return
    }
    fmt.Println(c1)
    //输出:{[{0 男 stu00} {1 男 stu01} {2 男 stu02} {3 男 stu03} {4 男 stu04} {5 男 stu05} {6 男 stu06} {7 男 stu07} {8 男 stu08} {9 男 stu09}]}
}
//小写例子

6.结构体标签Tag

Tag是结构体的元信息,可以在运行的时候通过反射的机制读取出来。 Tag在结构体字段的后方定义,由一对反引号包裹起来,具体的格式如下:
key1:"value1" key2:"value2"
结构体tag由一个或多个键值对组成。键与值使用冒号分隔,值用双引号括起来。同一个结构体字段可以设置多个键值对tag,不同的键值对之间使用空格分隔。
注意事项: 为结构体编写Tag时,必须严格遵守键值对的规则。结构体标签的解析代码的容错能力很差,一旦格式写错,编译和运行时都不会提示任何错误,通过反射也无法正确取值。例如不要在key和value之间添加空格。

到此这篇关于GoLang之标准库encoding/json包的文章就介绍到这了,更多相关GoLang encoding/json包内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_52690231/article/details/124065546

延伸 · 阅读

精彩推荐
  • Golang在go文件服务器加入http.StripPrefix的用途介绍

    在go文件服务器加入http.StripPrefix的用途介绍

    这篇文章主要介绍了在go文件服务器加入http.StripPrefix的用途介绍,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    yyyzhhhhh6962021-03-07
  • Golanggolang return省略用法说明

    golang return省略用法说明

    这篇文章主要介绍了golang return省略用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    david___8262021-03-01
  • Golang简单聊一聊Go语言中的数组和切片

    简单聊一聊Go语言中的数组和切片

    数组和切片由于语法十分相似,在使用中容易混淆,要认真区分,下面这篇文章主要给大家介绍了关于Go语言中数组和切片的相关资料,需要的朋友可以参考下...

    架构精进之路4532021-08-16
  • GolangGolang爬虫及正则表达式的实现示例

    Golang爬虫及正则表达式的实现示例

    本文主要介绍了Golang爬虫及正则表达式的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    小紫苏11842022-01-25
  • Golang学习GO编程必备知识汇总

    学习GO编程必备知识汇总

    这篇文章主要介绍了学习GO编程必备知识汇总的相关资料,需要的朋友可以参考下 ...

    脚本之家2572020-05-01
  • GolangGo 实现英尺和米的简单单位换算方式

    Go 实现英尺和米的简单单位换算方式

    这篇文章主要介绍了Go 实现英尺和米的简单单位换算方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    潘广宇 Leo7452021-06-08
  • Golang浅谈Golang是如何读取文件内容的(7种)

    浅谈Golang是如何读取文件内容的(7种)

    这篇文章主要介绍了浅谈Golang是如何读取文件内容的,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们...

    第八共同体29942020-07-11
  • Golanggolang基础之Interface接口的使用

    golang基础之Interface接口的使用

    这篇文章主要介绍了golang基础之Interface接口的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 ...

    failymao4162020-05-17