最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

編譯自 Custom JSON Marshalling in Go

前言

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

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

這些都是我們常用的設(shè)置技巧。

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

以下是譯文

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()},
	)
}

序列化的結(jié)果

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

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

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

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(),
	})
}

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

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

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

解決辦法就是為原始類型起一個(gè)別名,別名會有原始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),
	})
}

同樣的技術(shù)也可以應(yīng)用于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的序列化方法譯文的詳細(xì)內(nèi)容,更多關(guān)于Go Json序列化自定義的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • idea搭建go環(huán)境實(shí)現(xiàn)go語言開發(fā)

    idea搭建go環(huán)境實(shí)現(xiàn)go語言開發(fā)

    這篇文章主要給大家介紹了關(guān)于idea搭建go環(huán)境實(shí)現(xiàn)go語言開發(fā)的相關(guān)資料,文中通過圖文介紹以及代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用go具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-01-01
  • Go高級特性探究之信號處理詳解

    Go高級特性探究之信號處理詳解

    信號是在Unix和類Unix操作系統(tǒng)中用于通知進(jìn)程發(fā)生了事件或異常的通信機(jī)制,本文主要來介紹一下Go中的信號處理的方法,需要的可以參考一下
    2023-06-06
  • 如何讓shell終端和goland控制臺輸出彩色的文字

    如何讓shell終端和goland控制臺輸出彩色的文字

    這篇文章主要介紹了如何讓shell終端和goland控制臺輸出彩色的文字的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • Go實(shí)現(xiàn)map并發(fā)安全的3種方式總結(jié)

    Go實(shí)現(xiàn)map并發(fā)安全的3種方式總結(jié)

    Go的原生map不是并發(fā)安全的,在多協(xié)程讀寫同一個(gè)map的時(shí)候,安全性無法得到保障,這篇文章主要給大家總結(jié)介紹了關(guān)于Go實(shí)現(xiàn)map并發(fā)安全的3種方式,需要的朋友可以參考下
    2023-10-10
  • Go語言中使用flag包對命令行進(jìn)行參數(shù)解析的方法

    Go語言中使用flag包對命令行進(jìn)行參數(shù)解析的方法

    這篇文章主要介紹了Go語言中使用flag包對命令行進(jìn)行參數(shù)解析的方法,文中舉了一個(gè)實(shí)現(xiàn)flag.Value接口來自定義flag的例子,需要的朋友可以參考下
    2016-04-04
  • Go語言JSON編解碼神器之marshal的運(yùn)用

    Go語言JSON編解碼神器之marshal的運(yùn)用

    這篇文章主要為大家詳細(xì)介紹了Go語言中JSON編解碼神器——marshal的運(yùn)用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-09-09
  • 解密Golang中Request對象的操作

    解密Golang中Request對象的操作

    這篇文章主要和大家深入探討?Golang?中的?Request?對象,并從多個(gè)方面介紹其功能、結(jié)構(gòu)和使用方法,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2023-05-05
  • 解決goxorm無法更新值為默認(rèn)值的問題

    解決goxorm無法更新值為默認(rèn)值的問題

    這篇文章主要介紹了解決goxorm無法更新值為默認(rèn)值的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 基于go interface{}==nil 的幾種坑及原理分析

    基于go interface{}==nil 的幾種坑及原理分析

    這篇文章主要介紹了基于go interface{}==nil 的幾種坑及原理分析,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Golang中fsnotify包監(jiān)聽文件變化的原理詳解

    Golang中fsnotify包監(jiān)聽文件變化的原理詳解

    Golang提供了一個(gè)強(qiáng)大的fsnotify包,它能夠幫助我們輕松實(shí)現(xiàn)文件系統(tǒng)的監(jiān)控,本文將深入探討fsnotify包的原理,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12

最新評論

喀什市| 太和县| 德保县| 鄱阳县| 龙门县| 河东区| 宁夏| 临湘市| 贵州省| 红原县| 石屏县| 图木舒克市| 桐梓县| 惠东县| 惠安县| 包头市| 黔西县| 连云港市| 辽中县| 新乐市| 咸宁市| 山阴县| 揭阳市| 鹿泉市| 正阳县| 宾阳县| 宜兰市| 洪湖市| 四川省| 水富县| 革吉县| 都匀市| 霍城县| 建水县| 河池市| 监利县| 太和县| 阿荣旗| 酉阳| 达尔| 扶风县|