GoLang之标准库encoding/json包
作者:GoGo在努力
注:本文以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包介绍
4.Marshal函数
//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,"}]}*/ } //大写例子
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函数
//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}]} } //结构体大写例子
//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包内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!