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

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

對嵌套結(jié)構(gòu)使用自定義解組時,GoLang 結(jié)構(gòu)無法正確解組

對嵌套結(jié)構(gòu)使用自定義解組時,GoLang 結(jié)構(gòu)無法正確解組

Go
一只萌萌小番薯 2023-04-04 14:21:16
我們需要為嵌套在不需要自定義解組器的多個其他結(jié)構(gòu)中的結(jié)構(gòu)使用自定義解組器。我們有很多結(jié)構(gòu)類似于B下面定義的結(jié)構(gòu)(類似于嵌套A)。代碼的輸出是true false 0(預(yù)期的true false 2)。有任何想法嗎?在此處轉(zhuǎn)到 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)}編輯:問題在此處被標(biāo)記為重復(fù),但A顯式填寫字段會使我們的 API 混亂。同樣在創(chuàng)建A一個顯式字段之后,結(jié)果是false false 2這樣它根本沒有幫助。
查看完整描述

1 回答

?
拉莫斯之舞

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

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

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

  1. 讓 B 嵌入另一個包含 A 中不包含的字段的結(jié)構(gòu) C。

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

使用新B.UnmarshalJSON()方法,您現(xiàn)在也可以完全控制解組外部字段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

}


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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