第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

如何在 Go 中使用自定義屬性類型進(jìn)行 json 解組

如何在 Go 中使用自定義屬性類型進(jìn)行 json 解組

Go
萬千封印 2023-07-26 10:10:40
在我的項目中,我定義了結(jié)構(gòu)以便從 JSON 獲取數(shù)據(jù)。我嘗試使用json.Unmarshal()函數(shù)。但它不適用于自定義類型屬性。有一個這樣的結(jié)構(gòu):type TestModel struct {    ID   NullInt `json:"id"`    Name string  `json:"name"`}在那里,NullInt類型是通過MarshalJSON()和UnmarshalJSON()函數(shù)的實現(xiàn)來定義的:// NullInt ...type NullInt struct {    Int   int    Valid bool}// MarshalJSON ...func (ni NullInt) MarshalJSON() ([]byte, error) {    if !ni.Valid {        return []byte("null"), nil    }    return json.Marshal(ni.Int)}// UnmarshalJSON ...func (ni NullInt) UnmarshalJSON(b []byte) error {    fmt.Println("UnmarshalJSON...")    err := json.Unmarshal(b, &ni.Int)    ni.Valid = (err == nil)    fmt.Println("NullInt:", ni)    return err}在main()功能上,我實現(xiàn)了:func main() {    model := new(TestModel)    JSON := `{        "id": 1,        "name": "model"     }`    json.Unmarshal([]byte(JSON), &model)    fmt.Println("model.ID:", model.ID) }在控制臺中,我得到:UnmarshalJSON...NullInt: {1 true}model.ID: {0 false}正如您所看到的,NullInt.UnmarshalJSON()被調(diào)用并且ni是我所期望的但model.ID值。 實現(xiàn)功能的正確方法是什么UnmarshalJSON()?另外,當(dāng)我設(shè)置:(JSON := `{"name": "model"}`沒有id)時,控制臺只是:model.ID: {0 false}這意味著,該UnmarshalJSON()函數(shù)沒有被調(diào)用,然后我沒有model.ID以正確的方式獲得 的值。
查看完整描述

1 回答

?
胡子哥哥

TA貢獻(xiàn)1825條經(jīng)驗 獲得超6個贊

UnmarshalJSON()需要修改接收者,所以必須使用指針接收者:


func (ni *NullInt) UnmarshalJSON(b []byte) error {

    // ...

}

接收者和所有參數(shù)只是副本,如果不使用指針,則只能修改副本,該副本在方法返回后將被丟棄。如果您使用指針接收器,那也只是一個副本,但指向的值將是相同的,因此您可以修改原始(指向)對象。


為了保持一致性,其他方法也使用指針接收器。


通過此更改,它可以工作并輸出(在Go Playground上嘗試):


UnmarshalJSON...

NullInt: &{1 true}

model.ID: {1 true}


查看完整回答
反對 回復(fù) 2023-07-26
  • 1 回答
  • 0 關(guān)注
  • 154 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號