Go語言中序列化與反序列化示例詳解
前言
Go語言的序列化與反序列化在工作中十分常用,在Go語言中提供了相關(guān)的解析方法去解析JSON,操作也比較簡單
序列化
// 數(shù)據(jù)序列化
func Serialize(v interface{})([]byte, error)
// fix參數(shù)用于添加前綴
//idt參數(shù)用于指定你想要縮進的方式
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中,我們會先去檢測傳進來對象是否為內(nèi)置類型,是則編碼,不是則會先檢查當前對象是否已經(jīng)實現(xiàn)了Marshaler接口,實現(xiàn)則執(zhí)行MarshalJSON方法得到自定義序列化后的數(shù)據(jù),沒有則繼續(xù)檢查是否實現(xiàn)了TextMarshaler接口,實現(xiàn)的話則執(zhí)行MarshalText方法對數(shù)據(jù)進行序列化
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該函數(shù)會把傳入的數(shù)據(jù)作為json解析,然后把解析完的數(shù)據(jù)存在arbitrarily中,arbitrarily是任意類型的參數(shù),我們在用此函數(shù)進行解析時,并不知道傳入?yún)?shù)類型所以它可以接收所有類型且它一定是一個類型的指針
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)
}總結(jié)
到此這篇關(guān)于Go語言中序列化與反序列化的文章就介紹到這了,更多相關(guān)Go序列化與反序列化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語言中三個輸入函數(shù)(scanf,scan,scanln)的區(qū)別解析
本文詳細介紹了Go語言中三個輸入函數(shù)Scanf、Scan和Scanln的區(qū)別,包括用法、功能和輸入終止條件等,本文給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧2024-10-10
Go Excelize API源碼解讀GetSheetViewOptions與SetPageLayo
這篇文章主要為大家介紹了Go Excelize API源碼解讀GetSheetViewOptions與SetPageLayout方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08
Windows系統(tǒng)中搭建Go語言開發(fā)環(huán)境圖文詳解
GoLand?是?JetBrains?公司推出的商業(yè)?Go?語言集成開發(fā)環(huán)境(IDE),這篇文章主要介紹了Windows系統(tǒng)中搭建Go語言開發(fā)環(huán)境詳解,需要的朋友可以參考下2022-10-10
Go語言網(wǎng)站使用異步編程和Goroutine提高Web的性能
作為一門現(xiàn)代化編程語言,Go語言提供了強大的異步編程能力,使得程序員可以以更高效的方式處理并發(fā)任務(wù),在Go語言中,使用Goroutine在單個進程中實現(xiàn)多任務(wù)并行處理,以及如何使用協(xié)程池來進一步提高Web服務(wù)器的處理能力,2024-01-01

