GoLang之标准库encoding/json包

 更新时间:2022年08月17日 13:25:55   作者:GoGo在努力  
本文主要介绍了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包介绍

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包内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Golang详细讲解常用Http库及Gin框架的应用

    Golang详细讲解常用Http库及Gin框架的应用

    下面这篇文章主要给大家介绍了关于Golang常用的Http库及Gin框架,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • Golang多线程爬虫高效抓取大量数据的利器

    Golang多线程爬虫高效抓取大量数据的利器

    Golang多线程爬虫是一种高效抓取大量数据的利器。Golang语言天生支持并发和多线程,可以轻松实现多线程爬虫的开发。通过使用Golang的协程和通道,可以实现爬虫的高效并发抓取、数据处理和存储
    2023-05-05
  • Go中Gzip与json搭配实现数据压缩demo

    Go中Gzip与json搭配实现数据压缩demo

    这篇文章主要为大家介绍了Go中Gzip与json搭配使用压缩数据的实现demo,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • 详解Go语言中for循环,break和continue的使用

    详解Go语言中for循环,break和continue的使用

    这篇文章主要通过一些示例为大家介绍一下Go语言中for循环、break和continue的基本语法以及使用,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-06-06
  • 浅析Go语言bitset的实现原理

    浅析Go语言bitset的实现原理

    bitset包是一个将非负整数映射到布尔值的位的集合,这篇文章主要通过开源包bitset来为大家分析一下位集合的设计和实现,感兴趣的可以学习一下
    2023-08-08
  • golang调用蓝兔支付实现网上支付功能

    golang调用蓝兔支付实现网上支付功能

    支付宝、微信的网上支付需要营业执照个人无法直接使用,如果个人需要实现网上支付功能,目前大部分应该是都是依赖第三方聚合支付来实现,本文就来介绍一下如何调用蓝兔支付实现网上支付功能,有需要的可以参考下
    2023-09-09
  • 详解Go语言中的作用域和变量隐藏

    详解Go语言中的作用域和变量隐藏

    这篇文章主要为大家介绍了Go语言中的作用域和变量隐藏,文中的示例代码讲解详细,对我们学习Go语言有一定的帮助,感兴趣的小伙伴可以了解一下
    2022-04-04
  • Golang中的path/filepath包用法

    Golang中的path/filepath包用法

    这篇文章主要介绍了Golang中的path/filepath包用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Golang开发Go依赖管理工具dep安装验证实现过程

    Golang开发Go依赖管理工具dep安装验证实现过程

    这篇文章主要为大家介绍了Golang开发Go依赖管理工具dep安装验证及初始化一系列实现过程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-11-11
  • golang并发下载多个文件的方法

    golang并发下载多个文件的方法

    今天小编就为大家分享一篇golang并发下载多个文件的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07

最新评论