首页 > 系统教程 > LINUX > 正文

json数据的序列化和反序列化

王林
发布: 2024-01-09 11:30:17
转载
4325人浏览过
导读 json的全称是Javascript object notation, 中文全称:js对象表示法。在序列化和反序列化的协议中,有:json、xml、yaml、protocol buffer等。其中json是前后端API契约数据的主要传输形式。json支持数值、布尔值、数组和对象四种数据类型。通过这四种数据类型,可以构建复杂的数据模型。

在go语言中,我们可以使用json标准库来实现数据的序列化和反序列化。这个库提供了方便的方法来序列化和反序列化map、结构体、数组、切片和内置的基本数据类型。通过使用json标准库,我们可以轻松地将数据转换为json格式,并在需要时将其解析回原始数据类型。这为我们处理数据提供了很大的便利性。

在这里,我将举三个例子来说明json的使用方法。对于初学者来说,可能经常只使用一种结构体对象来接收和发送数据。下面我们就来看看具体的例子。 1. 使用结构体对象接收数据: ``` type Person struct { Name string `json:"name"` Age int `json:"age"` } func main() { data := `{"name": "Alice", "age": 25}` var p Person err := json.Unmarshal([]byte(data), &p) if err != nil { fmt.Println("解析json失败:", err) return

json数据的序列化和反序列化

结构体

type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}

func main() {
var (
newPer Person
bts []byte
)
per:=Person{
Name: "Lily",
Age: 29,
}
// 序列化
if bts, err = json.Marshal(per); err !=nil{
log.Fatal(err.Error())
return
}

if err = json.Unmarshal(bts, &newPer); err !=nil{
log.Fatal(err.Error())
return
}
fmt.Println(newPer)
}

map

func main() {
var (
smap = map[string]int{
"Age": 28,
"Sex": 1,
"Floor": 12,
}
newSmap = make(map[string]int)
bts []byte
)
if bts, err = json.Marshal(smap); err !=nil {
log.Fatal(err.Error())
return
}
if err = json.Umarshal(bts, &newSmap); err !=nil {
log.Fatal(err.Error())
return
}
fmt.Println(newSmap)
}

数组或者slice动态数组

func main() {
var (
ages []int = []int{23, 20, 28, 25, 30}
bts []byte
err error
newAges = make([]int, len(ages))
)
if bts, err = json.Marshal(ages); err != nil {
fmt.Println(err.Error())
return
}
if err = json.Unmarshal(bts, &newAges); err != nil {
fmt.Println(err.Error())
return
}
fmt.Println("new ages: ", newAges)
return
}
初学者对结构体的json序列化和反序列化比较清楚,对后两种可能很少用,也不会用。

  • 对于数组类型数据,但是有些业务场景前端会使用。
  • 对于map类型,一般会在Go语言的服务端调用第三方REST接口时,服务端只想要指定的返回码,判断是否调用成功时。程序猿不想写整体的struct结构体定义,也可能是比较懒,然后用了一个map[string]interface{}去接收返回数据。这时候通过json标准库中的Unmarshal反序列化后,然后通过map["err_code"].(int)获取返回码,然后再做其他后续处理逻辑。

这里还要说明一个结构体时,有时候我会用到的特性,结构体的json支持的标签值特性omitempty,例如:
type Person struct {
Name string `json:"name,omitempty"`
Age int `json:"age"`
}
它表示,当函数omitempty的标签值时,它所对应的结构体的数据元素值如果是零值,则它不会输出。那就是说如果服务端返回的结构体数据中的某个元素为空时,不返回给前端这个元素,就可以使用omitempty的json标签值属性。

在这里给大家提供一个滴滴公司的一位高级工程师taowen写的json解析库,世界上最快的。github地址:jsoniter。

文章转载自 开源中国社区 [http://www.oschina.net]

以上就是json数据的序列化和反序列化的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号