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

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

對嵌套結構使用自定義解組時,GoLang 結構無法正確解組

對嵌套結構使用自定義解組時,GoLang 結構無法正確解組

Go
一只萌萌小番薯 2023-04-04 14:21:16
我們需要為嵌套在不需要自定義解組器的多個其他結構中的結構使用自定義解組器。我們有很多結構類似于B下面定義的結構(類似于嵌套A)。代碼的輸出是true false 0(預期的true false 2)。有任何想法嗎?在此處轉到 Playground 示例。package mainimport (    "fmt"    "encoding/json")type A struct {    X bool `json:"x"`    Y bool `json:"y"`}type B struct {    A    Z int `json:"z"`}func (a *A) UnmarshalJSON(bytes []byte) error {    var aa struct {        X string `json:"x"`        Y string `json:"y"`    }    json.Unmarshal(bytes, &aa)    a.X = aa.X == "123"    a.Y = aa.Y == "abc"    return nil}const myJSON = `{"x": "123", "y": "fff", "z": 2}`func main() {    var b B    json.Unmarshal([]byte(myJSON), &b)    fmt.Print(b.X," ",b.Y," ",b.Z)}編輯:問題在此處被標記為重復,但A顯式填寫字段會使我們的 API 混亂。同樣在創建A一個顯式字段之后,結果是false false 2這樣它根本沒有幫助。
查看完整描述

1 回答

?
拉莫斯之舞

TA貢獻1820條經驗 獲得超10個贊

由于B嵌入A,A.UnmarshalJSON()被暴露為B.UnmarshalJSON(). 因此,B實施json.Unmarshaler并因此json.Unmarshal()調用B.UnmarshalJSON()僅解組A的字段。B.Z這就是沒有從 JSON 中設置的原因。

這是我能想到的最簡單的方法,可以根據您不更改數據類型的約束使其工作A

  1. 讓 B 嵌入另一個包含 A 中不包含的字段的結構 C。

  2. 為 B 編寫一個 UnmarshalJSON() 方法,該方法將相同的 JSON 解組為 BA 和 BC 使用不在 A 中的字段定義另一個類型 C 的優點是您可以將其解組委托給 json 包。

使用新B.UnmarshalJSON()方法,您現在也可以完全控制解組外部字段A

type A struct {

    X bool `json:"x"`

    Y bool `json:"y"`

}


func (a *A) UnmarshalJSON(bytes []byte) error {

    // the special unmarshalling logic here

}


type C struct {

    Z int `json:"z"`

}


type B struct {

    A

    C

}


func (b *B) UnmarshalJSON(bytes []byte) error {

    if err := json.Unmarshal(bytes, &b.A); err != nil {

        return err

    }

    if err := json.Unmarshal(bytes, &b.C); err != nil {

        return err

    }

    return nil

}


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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