json基本介绍
json是一种轻量级的数据交换格式。易于人阅读和编写,同时也易于机器解析和生成
json是在2001开始退关使用的数据格式,目前已经成为主流的数据格式
json易于机器解析和生成,并有效的提升网络传输效率,通常程序在网络传输时会先将数据(结构体,map等)序列化成json字符串,到接收方得到接送字符串时,在反序列化恢复成原来的数据类型(结构体,map等)。这种方式已然成为哥哥语言的标准
json的应用场景
json数据格式说明
在js语言中,一切都是对象。因此,任何支持的类型都可以通过json来标识,例如字符串,数字,对象,数组等
json键值对是用来保存数据的一种方式
键/值对组合中的键名写在前面并用双引号“”包裹,使用冒号:分割,然后紧接着值:
www.json.cn网站可以验证一个json格式的数据是否正确,尤其是我们编写比较复杂的格式数据时候,很有用
json的序列化
json序列化是指,将有key-value结构的数据类型(比如结构体,map,切片)序列化成json字符创的操作
package main
import (
"encoding/json"
"fmt"
)
//定义一个结构体
type Monster struct {
Name string
Age int
Birthday string
Sal float64
Skill string
}
func testStruct() {
//演示
monster := Monster{
Name: "kunkun",
Age: 25,
Birthday: "1998-8-2",
Sal: 199999.0,
Skill: "niganma",
}
//将monster序列化
data, err := json.Marshal(&monster)
if err != nil {
fmt.Printf("序列号错误 err=%v\n", err)
}
//输出序列化后的结果
fmt.Printf("monster序列化后的结果=%v\n", string(data))
}
func main() {
//演示结构体,map,切片进行序列号
testStruct()
}
//monster序列化后的结果={"Name":"kunkun","Age":25,"Birthday":"1998-8-2","Sal":199999,"Skill":"niganma"}
json的反序列化
json饭序列化是指,将json字符串反序列化成对应数据类型(比如结构体,map,切片)的操作
package main
import (
"encoding/json"
"fmt"
)
//定义一个结构体
type Monster struct {
Name string
Age int
Birthday string
Sal float64
Skill string
}
//演示将json字符串,反序列成struct
func unmarshalStruct() {
//说明str在项目开发中,是通过网络传输获取到,或者是读取文件获取到
str := "{\"Name\":\"kunkun\",\"Age\":99,\"Birthday\":\"1998-8-2\",\"Sal\":90000,\"Skill\":\"sing\"}"
//定义一个monster实例
var monster Monster
err := json.Unmarshal([]byte(str), &monster)
if err != nil {
fmt.Printf("unmarshal err=%v\n", err)
}
fmt.Printf("反序列化后monster = %v\n", monster)
}
//演示将json字符串,反序列成map
func unmarshalMap() {
str := "{\"Name\":\"kunkun\",\"Age\":99,\"Birthday\":\"1998-8-2\",\"Sal\":90000,\"Skill\":\"dance\"}"
//定义一个map
var a map[string]interface{}
//反序列化
err := json.Unmarshal([]byte(str), &a)
if err != nil {
fmt.Printf("unmarshal err=%v\n", err)
}
fmt.Printf("反序列化后a = %v\n", a)
}
//演示将json字符串,反序列成slice
func unmarshalSlice() {
str := "[{\"address\":\"北疆\",\"Age\":\"99\",\"Name\":\"kunkun\"},"
"{\"address\":\"北疆\",\"Age\":\"99\",\"Name\":\"kunkun\"}]"
//定义一个slice
var slice []map[string]interface{}
//反序列化
err := json.Unmarshal([]byte(str), &slice)
if err != nil {
fmt.Printf("unmarshal err=%v\n", err)
}
fmt.Printf("反序列化后slice = %v\n", slice)
}
func main() {
unmarshalStruct()
unmarshalMap()
unmarshalSlice()
}