基本使用-编码
package main
import (
“encoding/json”
“fmt”
)
// Student 定义学生结构体
type Student struct {
Name string
Age int8
Score float64
}
func main() {
student := &Student{
Name: “tom”,
Age: 20,
Score: 89.50,
}
//返回两个值,一个byte类型的切片,一个是err
byteInfo, err := json.Marshal(student)
if err != nil {
fmt.Println(“json编码失败”,err)
return
}
fmt.Println(string(byteInfo))
}
//打印的值如下
// {“Name”:”tom”,”Age”:20,”Score”:89.5}
基本使用-解码
package main
import (
“encoding/json”
“fmt”
)
type Student3 struct {
Name string `json:”name”`
Age int8 `json:”age,string”`
Score float64 `json:”score,omitempty”`
}
func main() {
var data =`{“name”:”tom”,”age”:”20″,”score”:0.01}` //定义一个json串
//解码成结构体
s2 := &Student3{} //这里需要定义接收变量,
err:=json.Unmarshal([]byte(data),s2)
if err != nil {
fmt.Println(“解码失败”,err)
return
}
fmt.Println(*s2)
}
//打印的值如下:
{tom 20 0.01}
tag 标签的使用
功能一: 解决 key 值大小写问题
在生产环境中,json格式的字符串一般都是小写开头,但go编码出来的json字符串明显不符合,解决这个问题需要使用tag标签,有的小伙伴,就提出了问题,直接用小写表示不就行了吗?说多都是泪,直接上代码吧,先说结论 !结论是:如果是小写字母开头的话,编码时会忽略小写字段
package main
import (
"encoding/json"
"fmt"
)
// Student2 定义学生结构体
type Student2 struct {
name string
age int8
score float64
}
func main() {
student := &Student2{
name: "tom",
age: 20,
score: 89.50,
}
//返回两个值,一个byte类型的切片,一个是err
byteInfo, err := json.Marshal(student)
if err != nil {
fmt.Println("json编码失败",err)
return
}
fmt.Println(string(byteInfo))
}
原因如下 :
//在go中没有像的别的语言中的public,protected private这种关键字来约束变量是公有还是受保护的,在go语言中是使用大小写来区分的,只是要大写开头的变量,就可以在包外调用,小写开头的只能在包内使用,这也是为什么小写会被忽略的原因
解决办法 :
// Student2 定义学生结构体,只需要在改变如下就可以
type Student2 struct {
Name string `json:”name”`
Age int8 `json:”age”`
Score float64 `json:”score”`
}
//打印的数据如下,看到都可以变成小写了
//{“name”:”tom”,”age”:20,”score”:89.5}
功能二:忽略指定的字段
//如果在go的结构体中有些字段是没有必要传输的,可以使用-这个符号 来忽略字段
// Student2 定义学生结构体
type Student2 struct {
Name string `json:”-“` //这里改变了
Age int8 `json:”age”`
Score float64 `json:”score”`
}
//输入内容,则没有name字段了
{“age”:20,”score”:89.5}
功能三:可以序列化的时候忽略0值或空值
type Student2 struct {
Name string `json:”name”`
Age int8 `json:”age”`
Score float64 `json:”score,omitempty”`//这里添加了omitempty标签,如果是空值或零0值,则会忽略
}
student := &Student2{
Name: “tom”,
Age: 20,
Score: 0, //这个给个0值
}
//打印 输出如下,没有score字段
{“name”:”tom”,”age”:20}
功能四:在编码或解码过程中,可以通过指定string,number,boolean来改变字段类型
type Student2 struct {
Name string `json:”name”`
Age int8 `json:”age,string”` //把int8转成string
Score float64 `json:”score,omitempty”`
}
//打印输出
{“name”:”tom”,”age”:”20″}