详解Go语言中结构体与JSON间的转换
作者:陈明勇 发布时间:2024-04-28 09:10:50
前言
在日常开发中,我们往往会将 JSON
解析成对应的结构体,反之也会将结构体转成 JSON
。接下来本文会通过 JSON
包的两个函数,来介绍 JSON
与结构体之间的转换。
结构体转 JSON
Marshal(v any) ([]byte, error)
:将 v
转成 JSON
数据,以 []byte
的形式返回。
import (
"encoding/json"
"fmt"
)
type User struct {
Name string
Age int
Height float64
Weight *float64
Child bool
marriageStatus string
}
func main() {
weight := 120.5
user := User{
Name: "gopher",
Age: 18,
Height: 180.5,
Weight: &weight,
Child: false,
marriageStatus: "未婚",
}
jsonBytes, err := json.Marshal(user)
if err != nil {
fmt.Println("error: ", err)
return
}
fmt.Println(string(jsonBytes)) // {"Name":"gopher","Age":18,"Height":180.5,"Weight":120.5,"Child":false}
}
执行结果:
{"Name":"gopher","Age":18,"Height":180.5,"Weight":120.5,"Child":false}
根据结果可知:
不可导出字段(字段名以小写字母开头),是不能被转成
JSON
的key
的,这也符合Go
的语法规定,以小写字母开头的变量或结构体字段等,不能在包外被访问。转换后的字段名,与结构体字段的名字一样。
如果字段是指针类型,转换后的值为指针指向的字段值。
如果我们想要指定字段转换之后的命名,或者将一个可导出的字段进行忽略,可以通过给结构体字段打上 JSON
标签的方式实现。
import (
"encoding/json"
"fmt"
)
type User struct {
Name string `json:"name"`
Age int `json:"age"`
Height float64 `json:"height"`
Weight *float64 `json:"weight"`
Child bool `json:"child"`
MarriageStatus string `json:"-"`
}
func main() {
weight := 120.5
user := User{
Name: "gopher",
Age: 18,
Height: 180.5,
Weight: &weight,
Child: false,
MarriageStatus: "未婚",
}
jsonBytes, err := json.Marshal(user)
if err != nil {
fmt.Println("error: ", err)
return
}
fmt.Println(string(jsonBytes)) // {"name":"gopher","age":18,"height":180.5,"weight":120.5,"child":false}
}
通过给结构体字段定打上 JSON
标签,可指定转成 JSON
后的字段名,如果 JSON
标签的值为 -
,则在转换 JSON
时忽略此字段。
JSON 解析结构体
Unmarshal(data []byte, v any) error
:将 JSON
解析成指定的结构体。
import (
"encoding/json"
"fmt"
)
type User struct {
Name string `json:"name"`
Age int `json:"age"`
Height float64 `json:"height"`
Child bool `json:"-"`
marriageStatus string
}
func main() {
userStr := `
{
"name": "gopher",
"age": 18,
"height": 180.5,
"child": true,
"marriageStatus": "未婚"
}
`
user := &User{}
err := json.Unmarshal([]byte(userStr), &user)
if err != nil {
fmt.Println("error: ", err)
return
}
fmt.Printf("%#v", user) // &main.User{Name:"gopher", Age:18, Height:180.5, Child:false, marriageStatus:""}
}
执行结果:
&main.User{Name:"gopher", Age:18, Height:180.5, Child:false, marriageStatus:""}
根据结果可知:
使用Unmarshal
函数时,我们需要传入结构体的指针类型,否则结构体字段的值将不会被改变,因为底层是通过指针去修改结构体字段的值。
JSON
解析时,JSON
的 key
与结构体字段的匹配规则是:
优先查找
JSON
标签值和key
一样的,找到则将value
赋值给对应字段。如果没有
JSON
标签值与key
相匹配,则根据字段名进行匹配。
可以发现,如果结构体字段是非导出字段或 JSON
标签的值为 -
,将不会被匹配到。
小结
本文介绍了 Go
语言里,JSON
与结构体之间的转换。在结构体转 JSON
时,我们可以通过给字段打标签,指定转换后的 key
命名,需要注意的是,如果结构体的字段为非导出字段或字段的 JSON
标签值为 -
,在转换 JSON
时,将会被忽略。反之 JSON
解析结构体时也是一样的。
来源:https://juejin.cn/post/7176291854621605945


猜你喜欢
- 问题背景周一上班,首先向同事了解了一下上周的测试情况,被告知在多实例场景下 MySQL Server hang 住,无法测试下去,原生版本不
- 1. 初始化项目// ① npm i -g @vue/cli// ② vue create my-project// ③ npm insta
- request post 列表的方法今天拿着已经写好的服务接口, 尝试传送一些列表, 发现传送的结果跟实际传送的数据并不一致,然后又开始了漫
- 1、现象a.用localhost访问,正常b.用IP地址访问,则出现403错误2、分析a.怀疑是ACL问题,设置Everyone为完全控制,
- Python中怎么使用第三方模块?在Python可以在代码中导入模块,然后就可以使用第三方模块了。import 语句想使用Python源文件
- 字典是python中唯一内建的映射类型。字典中的值并没有特殊的顺序,但是都存储在一个特定的键(key)里。键可以是数字,字符串甚至是元组。1
- 服务器响应HTTP的类型ContentType大全,使用方法:<% Response.ContentType =&
- 1. 路由概念路由的本质就是一种对应关系,根据不同的URL请求,返回对应不同的资源。那么url地址和真实的资源之间就有一种对应的关系,就是路
- 给内存和cpu使用量设置限制在linux系统中,使用Python对内存和cpu使用量设置限制需要通过resource模块来完成。resour
- 以前学习ASP.NET MVC时,学习与应用,操作过数据显示,添加,编辑,更新和删除等功能。很多方法是相通的,看自己是怎样来进行方便,快捷,
- 正在学习javascript 的朋友可以把它当作小练习动手做一做。加强自己的动手编码能力。参考代码:<!DOCTYPE HTML PU
- 此篇博客学习的api如标题,分别是:current_url获取当前页面的url;page_source 获取当前页面的源码;ti
- 我们都知道数据是无价,如果不对数据进行备份,相当是让数据在裸跑,一旦服务器出问题,只有哭的份了。下面将介绍mysql数据库的自动备份,大家可
- 前言1.基准测试(benchmarking)是性能测试的一种类型,强调的是对一类测试对象的某些性能指标进行定量的、可复现、可对比的测试。进一
- 一、列表切片(Slicing)由于列表是元素的集合,我们应该能够获得这些元素的任何子集。 例如,如果想从列表中获得前三个元素,我们应该能够轻
- 前言最近组长安排着做一个项目,h5的应用下载项目,想着做起来还是比较容易,可是看到提出的需求,我就有点懵逼了!需要对应用的下载进行统计!!!
- 本文实例为大家分享了python利用opencv实现颜色检测的具体代码,供大家参考,具体内容如下需要实现倒车辅助标记检测的功能,倒车辅助标记
- FLV在线转换,是目前主流播客网上通用的一种视频解决方案需要用到的组件 ASPExecmencoderffmpeg.exe第一步骤: 在线转
- 今天彬Go要向大家推荐9款很棒的可在网页中绘制图表的JavaScript脚本,这些有趣的JS脚本可以帮助你快速方便的绘制图表(线、面、饼、条
- 本文实例分析了python多线程用法。分享给大家供大家参考。具体如下:今天在学习尝试学习python多线程的时候,突然发现自己一直对supe