网站首页 > 技术文章 正文
今天记录一下,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"}
猜你喜欢
- 2024-11-11 php+json+mysql实现前后端分离(php vue前后端分离)
- 2024-11-11 PHP中json解析失败原因, json_decode返回null解析失败原因
- 2024-11-11 如何使php的数组传递到js中(如何使php的数组传递到js中)
- 2024-11-11 Python操作JSON格式数据的技巧(python解析json数据)
- 2024-11-11 Linux(centos)用yum方式安装php最新版
- 2024-11-11 PHP 8.3 正式发布!(php8.0新功能)
- 2024-11-11 使用json_encode打印中文字符并且格式化(php代码)
- 2024-11-11 PhpStorm 2022.2 已发布(phpstorm2018)
- 2024-11-11 你不知道的PHP 8.3版本和它的一些有趣的变化
- 2024-11-11 通过WordPress HTTP API 获取json内容并解析
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)