Go语言中序列化与反序列化示例详解
前言
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)
}
总结
到此这篇关于Go语言中序列化与反序列化的文章就介绍到这了,更多相关Go序列化与反序列化内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
相关文章