golang学习之路—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标签。

扫描二维码关注公众号,回复: 14285833 查看本文章
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
原创不易,希望大家多多支持
如果文章对你有帮助,记得一键三连哦!❤️❤️❤️

猜你喜欢

转载自blog.csdn.net/weixin_44736475/article/details/114319772