优秀的编程知识分享平台

网站首页 > 技术文章 正文

go语言中的关于json编码与解码的注意点

nanyue 2024-11-11 12:27:25 技术文章 1 ℃

今天记录一下,go语言中关于json编码与解码的一些注意点,写习惯了php的编码或解码,再来写go的是真麻烦,php中直接一个json_encode()和json_decode()搞定!

---------------------

只要学不死!!

就往死里学!!

--------------------- 狂神哥

基本使用-编码

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"}

最近发表
标签列表