golang学习之路—json

Posted Casey321

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang学习之路—json相关的知识,希望对你有一定的参考价值。

JSON

JSON基本介绍

JSON(javascript Object Notation)是一种轻量级的数据交换格式。易与人阅读和编写。同时也易于机器解析和生成。

JSON是在2001年开始推广使用的数据格式,目前已经成为主流的数据格式。

JSON易于机器解析和生成,并有效地提升网络输出效率,通常程序在网络传输时会先将数据(结构体、map等)序列化成json字符串,到接收方得到json字符串时,再反序列化恢复成原来的数据类型(结构体、map等)。这种方式已经成为各个语言的标准。

应用场景(示意图)

JSON数据格式说明

在JS语言中,一切都是对象。因此,任何的数据类型都可以通过JSON来表示,例如字符串、数字、对象、数组、map、结构体等。

JSON键值对是用来保存数据的一种方式。键值对组合中的键名写在前面并用双引号“”包裹,使用冒号:分隔,然后紧接着值。

比如:
"name":"Casey","age":18
"name":"Tom","age":28,"address":["广州","上海"

JSON的序列化

json序列化是指,将有key-value结构的数据类型(比如结构体、map、切片等)序列化成json字符串的操作。

应用案例

演示结构体、map和切片的序列化,其它数据类型的序列化类似。

package main
import(
	"fmt"
	"encoding/json"
)
type Student struct
	Name string 
	Gender string 
	Age int 


//结构体序列化
func testStruct()
   stu := Student
	   Name : "Lily",
	   Gender:"女",
	   Age : 20,
	

	//将stu序列化
	data,err := json.Marshal(stu)
	if err != nil
		fmt.Println("序列化错误 err =",err)
	else
		fmt.Printf("stu struct序列化后 = %v\\n",string(data))
	


//map序列化
func testMap()
	//定义一个map
	var a map[string]interface
	//使用map,需要make
	a = make(map[string]interface)
	a["name"] = "Casey"
	a["age"] = 18
	a["gender"] = "女"
	//将a这个map进行序列化
	data,err := json.Marshal(a)
	if err != nil
		fmt.Println("序列化错误 err =",err)
	else
		fmt.Printf("a map序列化后 = %v\\n",string(data))
	


//对切片进行序列化
func testSlice()
	var slice []map[string]interface
	
	var m map[string]interface
	m = make(map[string]interface)
	m["name"] = "Casey"
	m["age"] = 20
	m["gender"] = "女"
	
	slice = append(slice,m)

	var m1 map[string]interface
	m1 = make(map[string]interface)
	m1["name"] = "Tom"
	m1["age"] = 22
	m1["gender"] = "男"

	slice = append(slice,m1)

	//将切片进行序列化操作
	data,err := json.Marshal(slice)
	
	if err != nil
		fmt.Printf("序列化错误 err= %v\\n",err)
	else
		fmt.Printf("slice 序列化后 = %v\\n",string(data))
	


func main()  

	testStruct()
	testMap()
	testSlice()

运行结果:

注意事项:
对于结构体的序列化,如果我们希望序列化后的key的名字,可以由我们自己制定,那么可以给struct制定一个tag标签。

type Student struct
	Name string `json:"stu_name"`
	Gender string `json:"stu_gender"`
	Age int `json:"stu_age"`


运行结果:

JSON的反序列化

json反序列化是指,将json字符串反序列化成对应的数据类型(比如结构体、map、切片等)的操作。

应用案例

演示将json字符串反序列化成结构体、map、切片。
代码演示:

package main
import(
	"fmt"
	"encoding/json"
)
type Student struct
	Name string 
	Gender string 
	Age int 


//结构体反序列化
func umarshalStruct()

	//str在项目开发中,是通过网络传输获取到,或者是读取文件等获取到的
   str := "\\"Name\\":\\"Casey\\",\\"age\\":18,\\"gender\\":\\"女\\""
 
   //定义一个Student实例
   var stu Student

	//将stu序列化
	err := json.Unmarshal([]byte(str),&stu)
	if err != nil
		fmt.Println("反序列化错误 err =",err)
	else
		fmt.Printf("struct反序列后 = %v\\n",stu)
	


//map反序列化
func unmarshalMap()
	str := "\\"Name\\":\\"Tom\\",\\"age\\":22,\\"gender\\":\\"男\\""
	
	//定义一个map
	var a map[string]interface

	//反序列化map不需要make,因为make操作被封装到Unmarshal函数中

	err := json.Unmarshal([]byte(str),&a)
	if err != nil
		fmt.Println("反序列化错误 err =",err)
	else
		fmt.Printf("map反序列后 = %v\\n",a)
	


//对切片进行反序列化
func unmarshalSlice()
	str := "[\\"Name\\":\\"Tom\\",\\"age\\":22,\\"gender\\":\\"男\\"," +
	        "\\"Name\\":\\"Jessical\\",\\"age\\":21,\\"gender\\":\\"女\\"]"
	var slice []map[string]interface
	
	//反序列化slice不需要make,因为make操作被封装到Unmarshal函数中
	//将切片进行反序列化操作
	err := json.Unmarshal([]byte(str),&slice)
	
	if err != nil
		fmt.Println("反序列化错误 err =",err)
	else
		fmt.Printf("slice反序列后 = %v\\n",slice)
	


func main()  

	umarshalStruct()
	unmarshalMap()
	unmarshalSlice()

运行结果:

说明:

  • 在反序列化一个json字符串是,要确保反序列化后的数据类型和原来序列化前的数据类型一致。
  • 如果json字符串是通过程序获取到的,则不需要对"转义处理。

博主首页链接:https://blog.csdn.net/weixin_44736475
原创不易,希望大家多多支持
如果文章对你有帮助,记得一键三连哦!❤️❤️❤️

以上是关于golang学习之路—json的主要内容,如果未能解决你的问题,请参考以下文章

Golang学习之路一环境搭建

Golang学习之路—map切片

go语言(golang)学习之路

Golang学习之路:结合GO+的学生管理系统

Golang学习之路:Go+体验分享及字面量讲解

GO语言的进阶之路-Golang高级数据结构定义