Go语言基础: JSON序列化
JSON 是一种轻量级的数据交换格式。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
首先得熟悉结构体:
package main
import "fmt"
type Student struct {
ID int
Gender string
Name string
Sno string
}
func main() {
var s = Student{
ID: 12,
Gender: "男",
Name: "李四",
Sno: "001",
}
fmt.Printf("%#v\n", s)
}
如上代码中定义了一个结构体并且打印
结果: main.Student{ID:12, Gender:"男", Name:"李四", Sno:"001"}
转化为JSON字符串
package main
import (
"encoding/json"
"fmt"
)
type Student struct {
ID int
Gender string
Name string
Sno string
}
func main() {
var s = Student{
ID: 12,
Gender: "男",
Name: "李四",
Sno: "001",
}
// fmt.Printf("%#v\n", s)
jsonbByte, _ := json.Marshal(s)
jsonStr := string(jsonbByte)
fmt.Println(jsonStr)
}
json.Marshal返回的是一个Byte类型的切片:
package json // import "encoding/json"
func Marshal(v any) ([]byte, error)
Marshal returns the JSON encoding of v.
然后用string将其转为字符串并打印
那么JSON字符串也可以转化为结构体
package main
import (
"encoding/json"
"fmt"
)
type Student struct {
ID int
Gender string
Name string
Sno string
}
func main() {
// 使用反引号就无须转义字符
var str = `{"ID":12,"Gender":"男","Name":"李四","Sno":"001"}`
var s Student
err := json.Unmarshal([]byte(str), &s)
if err != nil {
fmt.Println(err)
}
fmt.Printf("%#v", s)
}
这里用到Unmarshal函数来转换JSON字符串
package json // import "encoding/json"
func Unmarshal(data []byte, v any) error
Unmarshal parses the JSON-encoded data and stores the result in the value
pointed to by v. If v is nil or not a pointer, Unmarshal returns an
InvalidUnmarshalError.
代码中Unmarshal函数接收两个参数,第一个是字节类型的切片,第二个是结构体变量地址。
要注意的是,如果结构体中的某字段的首字母是小写的,那么是不能转化为JSON字符串的,因为是该字段是私有的。
可以利用结构体标签来更改JSON字符串中的key的形式
package main
import (
"encoding/json"
"fmt"
)
type Student struct {
ID int `json:"id"` // 添加了结构体标签
Gender string `json:"gender"`
Name string `json:"name"`
Sno string `json:"sno"`
}
func main() {
var s = Student{
ID: 12,
Gender: "男",
Name: "李四",
Sno: "001",
}
// fmt.Printf("%#v\n", s)
jsonbByte, _ := json.Marshal(s)
jsonStr := string(jsonbByte)
fmt.Println(jsonStr)
}
打印结果: {"id":12,"gender":"男","name":"李四","sno":"001"}
显然这个形式已经与之前的不一样了,首字母已经被改成了小写,这就是结构体标签作用之一。
下面是嵌套结构体的转化
package main
import (
"encoding/json"
"fmt"
)
// Student 学生结构体
type Student struct {
ID int `json:"id"`
Gender string `json:"gender"`
Name string `json:"name"`
Sno string `json:"sno"`
}
// Class 班级结构体
type Class struct {
Title string
Students []Student
}
func main() {
c := Class{
Title: "001 Class",
Students: make([]Student, 0), // make创建切片
}
for i := 1; i < 10; i++ {
s := Student{
ID: i,
Gender: "男",
Name: fmt.Sprintf("stu_%v", i),
}
c.Students = append(c.Students, s) // 加入切片
}
fmt.Println(c)
strByte, err := json.Marshal(c)
if err != nil {
fmt.Println(err)
} else {
strJson := string(strByte)
fmt.Println(strJson)
}
}
打印结果
{001 Class [{1 男 stu_1 } {2 男 stu_2 } {3 男 stu_3 } {4 男 stu_4 } {5 男 stu_5 } {6 男 stu_6 } {7 男 stu_7 } {8 男 stu_8 } {9 男 stu_9 }]}
{"Title":"001 Class","Students":[{"id":1,"gender":"男","name":"stu_1","sno":""},{"id":2,"gender":"男","name":"stu_2","sno":""},{"id":3,"gender":"男","name":"stu_3","sno":""},{"id":4,"gender":"男","name":_4","sno":""},{"id":5,"gender":"男","name":"stu_5","sno":""},{"id":6,"gender":"男","name":"stu_6","sno":""},{"id":7,"gender":"男","name":"stu_7","sno":""},{"id":8,"gender":"男","name":"stu_8","sno":""},{:9,"gender":"男","name":"stu_9","sno":""}]}
第一行是结构体信息,其后才是JSON数据
在这个JSON中是数据嵌套存放的,看着比较乱,可以借助 JSON在线解析 解析该数据
解析结果:
{
"Title":"001 Class",
"Students":[
{
"id":1,
"gender":"男",
"name":"stu_1",
"sno":""
},
{
"id":2,
"gender":"男",
"name":"stu_2",
"sno":""
},
{
"id":3,
"gender":"男",
"name":"stu_3",
"sno":""
},
{
"id":4,
"gender":"男",
"name":"stu_4",
"sno":""
},
{
"id":5,
"gender":"男",
"name":"stu_5",
"sno":""
},
{
"id":6,
"gender":"男",
"name":"stu_6",
"sno":""
},
{
"id":7,
"gender":"男",
"name":"stu_7",
"sno":""
},
{
"id":8,
"gender":"男",
"name":"stu_8",
"sno":""
},
{
"id":9,
"gender":"男",
"name":"stu_9",
"sno":""
}
]
}
那么又如何将这个字符串再转化回去?
如下所示
package main
import (
"encoding/json"
"fmt"
)
// Student 学生结构体
type Student struct {
ID int `json:"id"`
Gender string `json:"gender"`
Name string `json:"name"`
Sno string `json:"sno"`
}
// Class 班级结构体
type Class struct {
Title string
Students []Student
}
func main() {
str := `{"Title":"001 Class","Students":[{"id":1,"gender":"男","name":"stu_1","sno":""},{"id":2,"gender":"男","name":"stu_2","sno":""},{"id":3,"gender":"男","name":"stu_3","sno":""},{"id":4,"gender":"男","name":"stu_4","sno":""},{"id":5,"gender":"男","name":"stu_5","sno":""},{"id":6,"gender":"男","name":"stu_6","sno":""},{"id":7,"gender":"男","name":"stu_7","sno":""},{"id":8,"gender":"男","name":"stu_8","sno":""},{"id":9,"gender":"男","name":"stu_9","sno":""}]}`
var c = &Class{} // 地址
err := json.Unmarshal([]byte(str), c)
if err != nil {
fmt.Println(err)
}
fmt.Printf("%#v", *c)
}
打印结果
main.Class{Title:"001 Class", Students:[]main.Student{main.Student{ID:1, Gender:"男", Name:"stu_1", Sno:""}, main.Student{ID:2, Gender:"男", Name:"stu_2", Sno:""}, main.Student{ID:3, Gender:"男", Name:"stu_3", Sno:""}, main.Student{ID:4, Gender:"男", Name:"stu_4", Sno:""}, main.Student{ID:5, Gender:"男", Name:"stu_5", Sno:""}, main.Student{ID:6, Gender:"男", Name:"stu_6", Sno:""}, main.Student{ID:7, Gender:"男", Name:"stu_7", Sno:""}, main.Student{ID:8, Gender:"男", Name:"stu_8", Sno:""}, main.Student{ID:9, Gender:"男", Name:"stu_9", Sno:""}}}
JSON序列化就是将结构体转化为JSON字符串
JSON反序列化就是将JSON字符串转化为结构体
Go语言基础: JSON序列化的更多相关文章
- day15-Python运维开发基础(json序列化模块、random / time / zipfile / OS模块函数)
1. json序列化模块 # ### json """ 所有编程语言都能够识别的数据格式叫做json,是字符串 json: 将数据类型序列化成字符串 pickle:将数据 ...
- Python 基础之序列化模块pickle与json
一:pickle 序列化模块把不能够直接存储的数据,变得可存储就是序列化把存储好的数据,转化成原本的数据类型,加做反序列化 php: 序列化和反序列化(1)serialize(2)unserializ ...
- ASP.NET MVC4 json序列化器
ASP.NET MVC4中调用WEB API的四个方法 2012年06月07日00:05 it168网站原创 作者:廖煜嵘 编辑:景保玉 我要评论(0) [IT168技术]当今的软件开发中,设计软件的 ...
- Go语言基础之结构体
Go语言基础之结构体 Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. 类型别名和自定义类型 自定义类型 在G ...
- D09——C语言基础学PYTHON
C语言基础学习PYTHON——基础学习D09 20180903内容纲要: 线程.进程 1.paramiko 2.线程.进程初识 3.多线程 (1)线程的调用方式 (2)join (3)线程锁.递归锁. ...
- D05——C语言基础学PYTHON
C语言基础学习PYTHON——基础学习D05 20180815内容纲要: 1 模块 2 包 3 import的本质 4 内置模块详解 (1)time&datetime (2)datetime ...
- Go语言基础之10--面向对象编程2之方法
一.方法的定义 之前我们学习了结构体(struct),其仅仅是对数据的封装,并没有行为方法,还不是一个完全的面向对象的思路,所以现在我们来学习在结构体的基础上如何去定义一个方法.结构体(类)+方法=完 ...
- Go语言基础之8--面向对象编程1之结构体(struct)
一.结构体详解 1.1 声明和定义 1.Go中面向对象是通过struct来实现的, struct是用户自定义的类型 2.Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数 ...
- 在net中json序列化与反序列化 面向对象六大原则 (第一篇) 一步一步带你了解linq to Object 10分钟浅谈泛型协变与逆变
在net中json序列化与反序列化 准备好饮料,我们一起来玩玩JSON,什么是Json:一种数据表示形式,JSON:JavaScript Object Notation对象表示法 Json语法规则 ...
- #华为云·寻找黑马程序员# 如何实现一个优雅的Python的Json序列化库
在Python的世界里,将一个对象以json格式进行序列化或反序列化一直是一个问题.Python标准库里面提供了json序列化的工具,我们可以简单的用json.dumps来将一个对象序列化.但是这种序 ...
随机推荐
- 基于CMMI的软件工程及实训指导 第一章
第一章 软件工程基础 1. 软件工程概述 1.1 软件工程概念 软件工程是从管理和技术两方面来研究如何采用工程的概念.原理和技术方面并加以综合,指导开发人员更好地开发和维护计算机软件的一门新学科. 1 ...
- aar 真机测试
工具 bundletool.jar 官方下载位置 https://github.com/google/bundletool/releases 下载后改下名字方便输入命令 将aar 放在G盘根目录 ja ...
- K8s+Docker 学习笔记系列
学前知识 你需要掌握 Linux 的常用命令.你可以通过Linux 教程 来学习相关命令. Docker应用场景 Web 应用的自动化打包和发布. 自动化测试和持续集成.发布. 在服务型环境中部署和调 ...
- c# datagridview列宽自适应设置
- [Cisco][GNS3]Install IOU device in GNS3
1. 下載並安裝GNS3 下載位置 https://gns3.com/software 安裝 gns3-all-in-one 部屬GNS3 VM至virtualbox 下載並安裝VIX API htt ...
- 【Access】清空数据并重置自增主键
DELETE FROM tasks ALTER TABLE tasks ALTER COLUMN id COUNTER(1,1)
- 第三章 excel的表合并
本章内容比较简略,基于行或列进行统计运算 具体操作为:选中某一空白单元格,单击数据--数据工具--合并计算(依据需求选择数据与计算方式)
- defer语句
1.defer语句 延时机制,在函数中,经常需要创建资源(比如:数据库连接.文件句柄.锁等),为了在函数执行完毕后,及时释放资源,使用defer a. 当执行defer时,暂时不执行,会将defer后 ...
- python之pyqt5-第一个pyqt5程序-图像压缩工具-小记
(如想转载,请联系博主或贴上本博地址) 此为学习pyqt5的第一个程序,图像压缩工具. 因为比较简单,下面直接贴上代码. 效果图如下: # -*- coding: utf-8 -*- import s ...
- WSL终端无法启动
WSL终端无法启动 1.状态 (1)宿主系统重新启动后,通过菜单项无法启动终端. (2)在powershell中,通过命令:wsl -l -v,查看子系统均为为stopped状态. (3)Powers ...