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

golang MarshalJson的實(shí)現(xiàn)

 更新時(shí)間:2025年03月04日 09:17:54   作者:get200  
本文主要介紹了golang MarshalJson的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

在 Go 語言中,MarshalJSON 是一個(gè)接口方法,允許自定義類型在進(jìn)行 JSON 編碼時(shí)提供自定義的序列化邏輯。通過實(shí)現(xiàn) MarshalJSON 方法,你可以控制結(jié)構(gòu)體或其他類型在轉(zhuǎn)換為 JSON 時(shí)的表現(xiàn)。

基本用法

當(dāng)你想要自定義某個(gè)類型的 JSON 表現(xiàn)時(shí),可以實(shí)現(xiàn) json.Marshaler 接口,該接口只包含一個(gè)方法 MarshalJSON。實(shí)現(xiàn)該方法后,使用 json.Marshal 函數(shù)時(shí)會(huì)自動(dòng)調(diào)用你定義的 MarshalJSON 方法。

示例

以下是一個(gè)示例,展示如何自定義結(jié)構(gòu)體的 JSON 序列化:

package main

import (
    "encoding/json"
    "fmt"
)

// 定義一個(gè)結(jié)構(gòu)體
type User struct {
    Name  string
    Age   int
    Email string
}

// 為 User 實(shí)現(xiàn) MarshalJSON 方法
func (u User) MarshalJSON() ([]byte, error) {
    // 自定義 JSON 輸出格式
    return json.Marshal(struct {
        FullName string `json:"name"`
        Age      int    `json:"age"`
        Email    string `json:"email_address"`
    }{
        FullName: u.Name,
        Age:      u.Age,
        Email:    u.Email,
    })
}

func main() {
    user := User{Name: "Alice", Age: 30, Email: "alice@example.com"}

    // Marshal 用戶對(duì)象為 JSON
    jsonData, err := json.Marshal(user)
    if err != nil {
        fmt.Println("Error marshaling to JSON:", err)
        return
    }

    fmt.Println(string(jsonData)) // 輸出: {"name":"Alice","age":30,"email_address":"alice@example.com"}
}

解釋

  • 定義結(jié)構(gòu)體:我們定義了一個(gè) User 結(jié)構(gòu)體,包含 NameAge 和 Email 字段。
  • 實(shí)現(xiàn) MarshalJSON 方法:我們?yōu)?nbsp;User 結(jié)構(gòu)體實(shí)現(xiàn)了 MarshalJSON 方法。在這個(gè)方法中,我們自定義了 JSON 輸出格式。
  • 自定義輸出:在 MarshalJSON 方法中,我們使用匿名結(jié)構(gòu)體來定義最終的 JSON 格式。
  • 使用 json.Marshal:在 main 函數(shù)中,我們創(chuàng)建了一個(gè) User 實(shí)例,并使用 json.Marshal 將其轉(zhuǎn)換為 JSON 字符串。

注意事項(xiàng)

  • 錯(cuò)誤處理MarshalJSON 方法應(yīng)返回 error,以便在序列化過程中可以處理潛在的錯(cuò)誤。
  • 遞歸調(diào)用:在 MarshalJSON 方法中,如果調(diào)用 json.Marshal,需要確保所處理的結(jié)構(gòu)體不會(huì)遞歸調(diào)用自身的 MarshalJSON 方法。

Marshal函數(shù)將會(huì)遞歸遍歷整個(gè)對(duì)象,依次按成員類型對(duì)這個(gè)對(duì)象進(jìn)行編碼。

類型轉(zhuǎn)換規(guī)則如下:

  • bool類型:轉(zhuǎn)換為JSON的Boolean
  • 整數(shù)、浮點(diǎn)數(shù)等數(shù)值類型: 轉(zhuǎn)換為JSON的Number
  • string類型: 轉(zhuǎn)換為JSON的字符串(帶""引號(hào))
  • struct類型:轉(zhuǎn)換為JSON的Object,再根據(jù)各個(gè)成員的類型遞歸打包
  • 數(shù)組或切片類型: 轉(zhuǎn)換為JSON的Array
  • []byte類型: 會(huì)先進(jìn)行base64編碼然后轉(zhuǎn)換為JSON字符串
  • map類型:轉(zhuǎn)換為JSON的Object,key必須是string
  • interface{}類型: 按照內(nèi)部的實(shí)際類型進(jìn)行轉(zhuǎn)換
  • nil類型: 轉(zhuǎn)為JSON的null
  • channel,func等類型: 會(huì)返回UnsupportedTypeError

從golang到j(luò)son:

golangjson
boolBoolean
int、float等數(shù)字Number
stringString
[]byte(base64編碼)String
structObject,再遞歸打包
array/sliceArray
mapObject
interface{}按實(shí)際類型轉(zhuǎn)換
nilnull
channel,funcUnsupportedTypeError

從json到golang:

jsongolang
Booleanbool
Numberfloat64
Stringstring
Array[]interface{}
Objectmap[string]interface{}
nullnil

避坑

json.marshal使用不當(dāng),會(huì)存在base64編碼問題問題出現(xiàn)在:[]byte 在json.marshal時(shí)會(huì)進(jìn)行base64 encoding處理

解決辦法:使用json.RawMessagejson.RawMessage其實(shí)就是[]byte類型的重定義。可以進(jìn)行強(qiáng)制類型轉(zhuǎn)換。

現(xiàn)在有這么一種場(chǎng)景,結(jié)構(gòu)體中的其中一個(gè)字段的格式是未知的:

type Command struct {  
    ID   int  
    Cmd  string  
    Args *json.RawMessage  
}  

使用json.RawMessage的話,Args字段在Unmarshal時(shí)不會(huì)被解析,直接將字節(jié)數(shù)據(jù)賦值給Args。我們可以能先解包第一層的JSON數(shù)據(jù),然后根據(jù)Cmd的值,再確定Args的具體類型進(jìn)行第二次Unmarshal。

注意:一定要使用指針類型*json.RawMessage,否則在Args會(huì)被認(rèn)為是[]byte類型,在打包時(shí)會(huì)被打包成base64編碼的字符串。

使用interface{}, interface{}類型在Unmarshal時(shí),會(huì)自動(dòng)將JSON轉(zhuǎn)換為對(duì)應(yīng)的數(shù)據(jù)類型:

JSON的boolean: 轉(zhuǎn)換為bool
JSON的數(shù)值: 轉(zhuǎn)換為float64
JSON的字符串: 轉(zhuǎn)換為string
JSON的Array: 轉(zhuǎn)換為[]interface{}
JSON的Object: 轉(zhuǎn)換為map[string]interface{}
JSON的null: 轉(zhuǎn)換為nil

需要注意的有兩個(gè):

  • 一是所有的JSON數(shù)值自動(dòng)轉(zhuǎn)換為float64類型,使用時(shí)需要再手動(dòng)轉(zhuǎn)換為需要的int,int64等類型。
  • 二是JSON的object自動(dòng)轉(zhuǎn)換為map[string]interface{}類型,訪問時(shí)直接用JSON Object的字段名作為key進(jìn)行訪問。在不知道JSON數(shù)據(jù)的格式時(shí),可以使用interface{}。

自定義類型:如果希望自己定義對(duì)象的打包解包方式,可以實(shí)現(xiàn)以下的接口:

type Marshaler interface {  
    MarshalJSON() ([]byte, error)  
}  
type Unmarshaler interface {  
    UnmarshalJSON([]byte) error  
}  

實(shí)現(xiàn)該接口的對(duì)象需要將自己的數(shù)據(jù)打包和解包。如果實(shí)現(xiàn)了該接口,json在打包解包時(shí)則會(huì)調(diào)用自定義的方法,不再對(duì)該對(duì)象進(jìn)行其他處理。

總結(jié)

通過實(shí)現(xiàn) MarshalJSON 方法,可以為 Go 的自定義類型提供靈活的 JSON 序列化控制。這使得在與 JSON 數(shù)據(jù)交互時(shí),可以更好地控制數(shù)據(jù)的結(jié)構(gòu)和格式。

到此這篇關(guān)于golang MarshalJson的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)golang MarshalJson內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 利用Golang解析json數(shù)據(jù)的方法示例

    利用Golang解析json數(shù)據(jù)的方法示例

    Go提供了原生的JSON庫,并且與語言本身有效的集成在了一起。下面這篇文章將給大家介紹關(guān)于利用Golang解析json數(shù)據(jù)的方法,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),需要的朋友們下面跟著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-07-07
  • go語言通過odbc訪問Sql Server數(shù)據(jù)庫的方法

    go語言通過odbc訪問Sql Server數(shù)據(jù)庫的方法

    這篇文章主要介紹了go語言通過odbc訪問Sql Server數(shù)據(jù)庫的方法,實(shí)例分析了Go語言通過odbc連接與查SQL Server詢數(shù)據(jù)庫的技巧,需要的朋友可以參考下
    2015-03-03
  • Golang?template?包基本原理分析

    Golang?template?包基本原理分析

    這篇文章主要為大家介紹了Golang?template?包基本原理分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 從errors到pkg-errors詳解Go語言中的錯(cuò)誤處理指南

    從errors到pkg-errors詳解Go語言中的錯(cuò)誤處理指南

    錯(cuò)誤處理是編程語言中的重要組成部分,它直接影響程序的可靠性和可維護(hù)性,本文將深入探討Go語言中的錯(cuò)誤處理,從標(biāo)準(zhǔn)庫的errors包到第三方的pkg-errors庫,幫助開發(fā)者掌握錯(cuò)誤處理的最佳實(shí)踐,提高代碼的質(zhì)量和可維護(hù)性
    2026-04-04
  • golang時(shí)間字符串和時(shí)間戳轉(zhuǎn)換的案例

    golang時(shí)間字符串和時(shí)間戳轉(zhuǎn)換的案例

    這篇文章主要介紹了golang時(shí)間字符串和時(shí)間戳轉(zhuǎn)換的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 淺析Golang中rune類型的使用

    淺析Golang中rune類型的使用

    從golang源碼中看出,rune關(guān)鍵字是int32的別名(-231~231-1),對(duì)比byte(-128~127),可表示的字符更多,本文就來簡(jiǎn)單聊聊它的使用方法吧,希望對(duì)大家有所幫助
    2023-05-05
  • Go語言微服務(wù)中實(shí)現(xiàn)鏈路追蹤

    Go語言微服務(wù)中實(shí)現(xiàn)鏈路追蹤

    在微服務(wù)架構(gòu)中,鏈路追蹤技術(shù)可以幫助我們跟蹤請(qǐng)求在各個(gè)服務(wù)之間的傳播路徑,本文就來介紹一下Go語言微服務(wù)中實(shí)現(xiàn)鏈路追蹤,感興趣的可以了解一下
    2024-12-12
  • GO使用阿里云,解決go get下載項(xiàng)目慢或無法下載的情況

    GO使用阿里云,解決go get下載項(xiàng)目慢或無法下載的情況

    這篇文章主要介紹了GO使用阿里云,解決go get下載項(xiàng)目慢或無法下載的情況,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 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ì),對(duì)大家學(xué)習(xí)或者使用go具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-01-01
  • golang os.Eixt使用示例

    golang os.Eixt使用示例

    在Go語言中,os.Exit函數(shù)用于立即終止程序并返回一個(gè)指定的退出狀態(tài)碼,本文就來介紹一下golang os.Eixt使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-10-10

最新評(píng)論

德钦县| 娄底市| 葫芦岛市| 前郭尔| 清水县| 永顺县| 广宗县| 内黄县| 会宁县| 会宁县| 汾阳市| 寿宁县| 防城港市| 阳高县| 来凤县| 贵州省| 鄂托克前旗| 红安县| 莫力| 诸城市| 德兴市| 红河县| 红河县| 怀远县| 鄂伦春自治旗| 包头市| 房产| 二连浩特市| 耒阳市| 定陶县| 诸暨市| 涞水县| 日照市| 新闻| 饶平县| 江山市| 海城市| 德保县| 密云县| 金湖县| 雷波县|