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

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

如何在 Go 中使用自定義屬性類型進行 json 解組

如何在 Go 中使用自定義屬性類型進行 json 解組

Go
萬千封印 2023-07-26 10:10:40
在我的項目中,我定義了結構以便從 JSON 獲取數據。我嘗試使用json.Unmarshal()函數。但它不適用于自定義類型屬性。有一個這樣的結構:type TestModel struct {    ID   NullInt `json:"id"`    Name string  `json:"name"`}在那里,NullInt類型是通過MarshalJSON()和UnmarshalJSON()函數的實現來定義的:// 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()功能上,我實現了: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()被調用并且ni是我所期望的但model.ID值。 實現功能的正確方法是什么UnmarshalJSON()?另外,當我設置:(JSON := `{"name": "model"}`沒有id)時,控制臺只是:model.ID: {0 false}這意味著,該UnmarshalJSON()函數沒有被調用,然后我沒有model.ID以正確的方式獲得 的值。
查看完整描述

1 回答

?
胡子哥哥

TA貢獻1825條經驗 獲得超6個贊

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


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

    // ...

}

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


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


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


UnmarshalJSON...

NullInt: &{1 true}

model.ID: {1 true}


查看完整回答
反對 回復 2023-07-26
  • 1 回答
  • 0 關注
  • 142 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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