亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

MarshalJSON 未調用

MarshalJSON 未調用

Go
牛魔王的故事 2022-03-03 16:31:51
我正在嘗試MarshalJSON使用界面自定義 的輸出:func (m *RawMessage) MarshalJSON() ([]byte, error)我按照那個教程:http ://choly.ca/post/go-json-marshalling/我的目的是刪除用真/假(如果設置與否)替換其中一個字段,所以我最終編寫了該函數:func (u *Edition) MarshalJSON() ([]byte, error) {    var vaultValue bool    vaultValue = true    var onlineValue bool    vaultValue = false    fmt.Println("here")    if u.Vault == nil {        vaultValue = false    }    if u.Online == nil {        onlineValue = false    }    type AliasEdition Edition    return json.Marshal(&struct {        Vault  bool `json:"vault,omitempty"`        Online bool `json:"online,omitempty"`        *AliasEdition    }{        Vault:        vaultValue,        Online:       onlineValue,        AliasEdition: (*Alias)(u),    })}JSON 是使用以下指令從地圖創建的:json.NewEncoder(w).Encode(EditionsMap)顯然EditionsMap是Editions 結構的 Map:var EditionsMap map[string]datamodel.Edition問題是該MarshalJSON函數顯然從未被調用過??赡芪易鲥e了什么,但我不明白問題出在哪里,我的理解是我只需要實現那個函數就可以調用它。
查看完整描述

1 回答

?
藍山帝景

TA貢獻1843條經驗 獲得超7個贊

這是因為您使用指針Edition.MarshalJSON()接收器聲明了該方法:


func (u *Edition) MarshalJSON() ([]byte, error)

并且您嘗試編組非指針值(您的地圖包含datamodel.Edition值):


var EditionsMap map[string]datamodel.Edition

// ...

json.NewEncoder(w).Encode(EditionsMap)

具有指針接收器的方法不屬于相應非指針類型的方法集。類型的方法集datamodel.Edition 不包含方法MarshalJSON()。


規格:方法集:


一個類型可能有一個與之關聯的方法集。接口類型的方法集就是它的接口。任何其他類型的方法集由聲明為接收者類型T的所有方法T組成。對應指針類型 *T的方法集是所有用receiver *Tor聲明的方法的T集合(即它還包含 的方法集T)。


嘗試編組指針值,定義您的地圖以包含指針:


var EditionsMap map[string]*datamodel.Edition

// ...

if err := json.NewEncoder(w).Encode(EditionsMap); err != nil {

    panic(err) // HANDLE error somehow, do not omit it like in your example!

}

指針類型的值*Edition 確實有一個方法,該方法MarshalJSON()將被json包正確調用。在Go Playground上嘗試一個可行的示例。


另一種選擇是Edition.MarshalJSON()使用值接收器定義方法:


func (u Edition) MarshalJSON() ([]byte, error)

這樣,無論您編組指針值還是非指針值,它都可以工作,因為具有值接收器的方法是Edition類型和相應*Edition指針類型的方法集的一部分。在Go Playground上嘗試這個變體的工作示例。


查看完整回答
反對 回復 2022-03-03
  • 1 回答
  • 0 關注
  • 205 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號