GoLang之标准库encoding/json包

目录

1.JSON介绍

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

3.encoding/json包介绍

4.Marshal函数

5.Umarshal函数 

6.结构体标签Tag

注:本文以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包内容请搜索易知道(ezd.cc)以前的文章或继续浏览下面的相关文章希望大家以后多多支持易知道(ezd.cc)!

推荐阅读

    SQLite使用JSON扩展

    SQLite使用JSON扩展,插件,加载,一、介绍 SQLite3.9.0之后的版本,添加了JSON扩展。在表中可以保存JSON类型。实际上SQLite将JSON类型的

    postgresql中对jsonb的查询及转换

    postgresql中对jsonb的查询及转换,数据,字段,表数据:需要将strata排除,并且过滤info字段中为{}的数据,将jsonb转换成text,替换“,{,}见SQL:sele

    node express返回json数据给前端

    node express返回json数据给前端,上传,格式,请注意,使用res.json()的格式1.前面不能添加 res.writeHead(200, {‘content-type‘: ‘text/

    golang代理怎么设置

    golang代理怎么设置,代理,请求,设置,语言,客户端,应用程序,Go语言(或称Golang)是一种广受欢迎的编程语言,尤其适用于网络编程。在创建Web应用程序

    什么是golang

    什么是golang,语言,执行,编程语言,机器语言,高级语言,运行,golang是一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言;它可以在不损

    php中json字符串如何转csv格式

    php中json字符串如何转csv格式,文件,字符串,数据,文件句柄,分隔符,字段,php中json字符串转csv格式的方法:1、创建一个php示例文件;2、将JSON字符

    JSONArray是什么

    JSONArray是什么,方法,对象,用于,文本,类型,字符串,JSONArray是一个有序的值序列,它的外部文本形式是一个用方括号括起来的字符串,用逗号分隔值,内

    json数据格式有哪些

    json数据格式有哪些,数据格式,格式,对象,数组,教程,集合,json有两种数据格式,分别是:1、对象格式,“{"key1":obj,"key2":obj,"key3":obj...}

    Json和Lua table互转的Lua模块

    Json和Lua table互转的Lua模块,分词,字符串,先分词,再解析,少写了语法检查module( "json_to_lua", package.seeall )--##################

    Golang之wait.Until 简单测试用例

    Golang之wait.Until 简单测试用例,结束,主程序,测试目的,验证wait.Until的用法 //测试wait.Until() 的用途package mainimport ( "fmt