欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

自定義Go?Json的序列化方法譯文

 更新時間:2022年06月17日 14:29:27   作者:Ilia?Choly  
這篇文章主要為大家介紹了自定義Go?Json序列化方法譯文,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

編譯自 Custom JSON Marshalling in Go。

前言

我們知道,通過tag,可以有條件地實現(xiàn)定制Go JSON序列化的方式,比如json:",omitempty", 當字段的值為空的時候,我們可以在序列化后的數(shù)據(jù)中不包含這個值,而json:"-"可以直接不被JSON序列化,如果想被序列化key-,可以設置tag為json:"-,",加個逗號。

如果你為類型實現(xiàn)了MarshalJSON() ([]byte, error)和UnmarshalJSON(b []byte) error方法,那么這個類型在序列化反序列化時將采用你定制的方法。

這些都是我們常用的設置技巧。

如果臨時想為一個struct增加一個字段的話,可以采用本譯文的技巧,臨時創(chuàng)建一個類型,通過嵌入原類型的方式來實現(xiàn)。他和JSON and struct composition in Go一文中介紹的技巧還不一樣(譯文和jsoniter-go擴展可以閱讀陶文的Golang 中使用 JSON 的一些小技巧)。JSON and struct composition in Go一文中是通過嵌入的方式創(chuàng)建一個新的類型,你序列化和反序列化的時候需要使用這個新類型,而本譯文中的方法是無痛改變原類型的MarshalJSON方式,采用Alias方式避免遞歸解析,確實是一種非常巧妙的方法。

以下是譯文

Go的 encoding/json序列化strcut到JSON數(shù)據(jù):

package main
import (
	"encoding/json"
	"os"
	"time"
)
type MyUser struct {
	ID       int64     `json:"id"`
	Name     string    `json:"name"`
	LastSeen time.Time `json:"lastSeen"`
}
func main() {
	_ = json.NewEncoder(os.Stdout).Encode(
		&MyUser{1, "Ken", time.Now()},
	)
}

序列化的結果

{"id":1,"name":"Ken","lastSeen":"2009-11-10T23:00:00Z"}

但是如果我們想改變一個字段的顯示結果我們要怎么做呢?例如,我們想把LastSeen顯示為unix時間戳。

最簡單的方式是引入另外一個輔助struct,在MarshalJSON中使用它進行正確的格式化:

func (u *MyUser) MarshalJSON() ([]byte, error) {
	return json.Marshal(&struct {
		ID       int64  `json:"id"`
		Name     string `json:"name"`
		LastSeen int64  `json:"lastSeen"`
	}{
		ID:       u.ID,
		Name:     u.Name,
		LastSeen: u.LastSeen.Unix(),
	})
}

這樣做當然沒有問題,但是如果有很多字段的話就會很麻煩,如果我們能把原始struct嵌入到新的struct中,并讓它繼承所有不需要改變的字段就太好了:

func (u *MyUser) MarshalJSON() ([]byte, error) {
	return json.Marshal(&struct {
		LastSeen int64 `json:"lastSeen"`
		*MyUser
	}{
		LastSeen: u.LastSeen.Unix(),
		MyUser:   u,
	})
}

但是等等,問題是這個輔助struct也會繼承原始struct的MarshalJSON方法,這會導致這個方法進入無限循環(huán)中,最后堆棧溢出。

解決辦法就是為原始類型起一個別名,別名會有原始struct所有的字段,但是不會繼承它的方法:

func (u *MyUser) MarshalJSON() ([]byte, error) {
	type Alias MyUser
	return json.Marshal(&struct {
		LastSeen int64 `json:"lastSeen"`
		*Alias
	}{
		LastSeen: u.LastSeen.Unix(),
		Alias:    (*Alias)(u),
	})
}

同樣的技術也可以應用于UnmarshalJSON方法:

func (u *MyUser) UnmarshalJSON(data []byte) error {
	type Alias MyUser
	aux := &struct {
		LastSeen int64 `json:"lastSeen"`
		*Alias
	}{
		Alias: (*Alias)(u),
	}
	if err := json.Unmarshal(data, &aux); err != nil {
		return err
	}
	u.LastSeen = time.Unix(aux.LastSeen, 0)
	return nil
}

以上就是自定義Go Json的序列化方法譯文的詳細內(nèi)容,更多關于Go Json序列化自定義的資料請關注腳本之家其它相關文章!

相關文章

  • 一文帶你輕松學會Go語言動態(tài)調(diào)用函數(shù)

    一文帶你輕松學會Go語言動態(tài)調(diào)用函數(shù)

    這篇文章主要是帶大家學習一下Go語言是如何動態(tài)調(diào)用函數(shù)的,文中的示例代碼講解詳細,對我們學習Go語言有一定的幫助,需要的可以參考下
    2022-11-11
  • GoFrame框架garray對比PHP的array優(yōu)勢

    GoFrame框架garray對比PHP的array優(yōu)勢

    這篇文章主要為大家介紹了GoFrame框架garray對比PHP的array優(yōu)勢詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Golang操作excel的方法

    Golang操作excel的方法

    這篇文章主要介紹了Golang操作excel的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • 詳解golang RWMutex讀寫互斥鎖源碼分析

    詳解golang RWMutex讀寫互斥鎖源碼分析

    這篇文章主要介紹了詳解golang RWMutex讀寫互斥鎖源碼分析,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • 一文帶你理解Go語言中方法的本質(zhì)

    一文帶你理解Go語言中方法的本質(zhì)

    我們知道,Go語言從設計伊始,就不支持經(jīng)典的面向?qū)ο笳Z法元素,但?Go?語言仍保留了名為“方法(method)”的語法元素,下面我們就來帶大家深入了解一下Go語言中的方法吧
    2023-11-11
  • GoFrame?ORM原生方法操作示例

    GoFrame?ORM原生方法操作示例

    這篇文章主要為大家介紹了GoFrame?ORM原生方法操作示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • 利用Go語言實現(xiàn)Raft日志同步

    利用Go語言實現(xiàn)Raft日志同步

    這篇文章主要為大家詳細介紹了如何利用Go語言實現(xiàn)Raft日志同步,文中的示例代碼講解詳細,對我們深入了解Go語言有一定的幫助,需要的可以參考一下
    2023-05-05
  • go單體日志采集zincsearch方案實現(xiàn)

    go單體日志采集zincsearch方案實現(xiàn)

    這篇文章主要為大家介紹了go單體日志采集zincsearch方案實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • Go語言中字符串的查找方法小結

    Go語言中字符串的查找方法小結

    這篇文章主要介紹了Go語言中字符串的查找方法小結,示例的main函數(shù)都是導入strings包然后使用其中的方法,需要的朋友可以參考下
    2015-10-10
  • Go 防止 goroutine 泄露的方法

    Go 防止 goroutine 泄露的方法

    Go 的并發(fā)模型與其他語言不同,雖說它簡化了并發(fā)程序的開發(fā)難度,但如果不了解使用方法,常常會遇到 goroutine 泄露的問題。本篇主要從如何寫出正確代碼的角度來介紹如何防止 goroutine 的泄露,需要的朋友可以參考下
    2019-09-09

最新評論