Go语言中序列化与反序列化示例详解
作者:前端若水 时间:2024-02-10 11:43:57
前言
Go语言的序列化与反序列化在工作中十分常用,在Go语言中提供了相关的解析方法去解析JSON,操作也比较简单
序列化
// 数据序列化
func Serialize(v interface{})([]byte, error)
// fix参数用于添加前缀
//idt参数用于指定你想要缩进的方式
func serialization (v interface{}, fix, idt string) ([]byte, error)
array、slice、map、struct对象
//struct
import (
"encoding/json"
"fmt"
)
type Student struct {
Id int64
Name string
Desc string
}
func fn() {
std := &Student{0, "Ruoshui", "this to Go"}
data, err := json.MarshalIndent(std, "", " ")
if err != nil {
fmt.Println(err)
}
fmt.Println(string(data))
}
//array、slice、map
func fc() {
s := []string{"Go", "java", "php"}
d, _ := json.MarshalIndent(s, "", "\t")
fmt.Println(string(d))
m := map[string]string{
"id": "0",
"name":"ruoshui",
"des": "this to Go",
}
bytes, _ := json.Marshal(m)
fmt.Println(string(bytes))
}
序列化的接口
在json.Marshal中,我们会先去检测传进来对象是否为内置类型,是则编码,不是则会先检查当前对象是否已经实现了Marshaler接口,实现则执行MarshalJSON方法得到自定义序列化后的数据,没有则继续检查是否实现了TextMarshaler接口,实现的话则执行MarshalText方法对数据进行序列化
MarshalJSON与MarshalText方法虽然返回的都是字符串,不过MarshalJSON方法返回的带引号,MarshalText方法返回的不带引号
//返回带引号字符串
type Marshaler interface {
MarshalJSON() ([]byte, error)
}
type Unmarshaler interface {
UnmarshalJSON([]byte) error
}
//返回不带引号的字符串
type TextMarshaler interface {
MarshalText() (text []byte, err error)
}
type TextUnmarshaler interface {
UnmarshalText(text []byte) error
}
反序列化
func Unmarshal(data [] byte, arbitrarily interface{}) error
该函数会把传入的数据作为json解析,然后把解析完的数据存在arbitrarily中,arbitrarily是任意类型的参数,我们在用此函数进行解析时,并不知道传入参数类型所以它可以接收所有类型且它一定是一个类型的指针
slice、map、struct反序列化
//struct
type Student struct {
Id int64 `json:"id,string"`
Name string `json:"name,omitempty"`
Desc string `json:"desc"`
}
func fn() {
str := `{"id":"0", "name":"ruoshui", "desc":"new Std"}`
var st Student
_ = json.Unmarshal([]byte(str), &st)
fmt.Println(st)
}
//slice和map
func f() {
slice := `["java", "php", "go"]`
var sli []string
_ = json.Unmarshal([]byte(slice), &sli)
fmt.Println(sli)
mapStr := `{"a":"java", "b":"node", "c":"php"}`
var newMap map[string]string
_ = json.Unmarshal([]byte(mapStr), &newMap)
fmt.Println(newMap)
}
来源:https://juejin.cn/post/7122270032448454664
标签:go,反序列化,序列化
0
投稿
猜你喜欢
c#连接sqlserver数据库、插入数据、从数据库获取时间示例
2024-01-16 02:13:53
Python之is与==的区别详解
2021-08-23 21:00:04
详细解读php的命名空间(二)
2023-06-06 16:12:38
SQL数据库十四种案例介绍
2024-01-14 14:50:42
面试官问订单ID是如何生成的?难道不是MySQL自增主键
2024-01-24 00:36:24
python之yield和Generator深入解析
2022-09-16 01:25:39
Python OpenCV基于HSV的颜色分割实现示例
2021-11-04 19:24:26
CSS选择符小讲
2009-09-17 11:53:00
document.getElementById的简写方式
2010-06-21 10:44:00
vscode调试container中的程序的方法步骤
2022-03-06 14:20:25
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
2023-03-25 16:23:00
修改mysql默认字符集的两种方法详细解析
2024-01-27 01:48:17
一文详解Python中的行为验证码验证功能
2023-04-18 02:00:56
MySQL 数据类型详情
2024-01-21 11:51:12
教你如何使用php session
2023-11-15 06:28:01
Vue3中watch的使用详解
2024-05-09 15:20:19
一文详解如何实现PyTorch模型编译
2023-06-03 02:46:27
Python机器学习之决策树算法实例详解
2022-10-06 07:24:37
opencv绘制矩形和圆的实现
2021-09-24 15:27:22
一起来了解python的运算符
2022-08-29 03:01:17