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

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

在 Go 中,類型名稱處理與編碼/json 的等效性是什么?

在 Go 中,類型名稱處理與編碼/json 的等效性是什么?

Go
GCT1015 2022-10-04 19:58:50
散文中的簡短描述我有一個(gè)情況,我想將JSON數(shù)據(jù)解封為一個(gè)結(jié)構(gòu)數(shù)組(或更多),這些結(jié)構(gòu)都實(shí)現(xiàn)了一個(gè)公共接口。此外,實(shí)現(xiàn)接口的所有 eligble 結(jié)構(gòu)類型都有一個(gè)公共字段,我在下面的示例中將其命名。鑒別器1 允許雙唯一地為每個(gè)鑒別器值找到正確的結(jié)構(gòu)類型。FooBarMyInterfaceDiscrimininator問題和錯(cuò)誤消息但在解封過程中,代碼并不“知道”哪個(gè)是正確的“目標(biāo)”類型。取消封馬連接失敗。不能將對象解封為 main 類型的 Go 值。我的接口姆威在https://play.golang.org/p/Dw1hSgUezLHpackage mainimport (    "encoding/json"    "fmt")type MyInterface interface {    // some other business logic methods go here!    GetDiscriminator() string // GetDiscriminator returns something like a key that is unique per struct type implementing the interface}type BaseStruct struct {    Discriminator string // will always be "Foo" for all Foos, will always be "Bar" for all Bars}type Foo struct {    BaseStruct    // actual fields of the struct don't matter. it's just important that they're different from Bar    FooField string}func (foo *Foo) GetDiscriminator() string {    return foo.Discriminator}type Bar struct {    BaseStruct    // actual fields of the struct don't matter. it's just important that they're different from Foo    BarField int}func (bar *Bar) GetDiscriminator() string {    return bar.Discriminator}其他語言從 .NET 中已知的類型名稱處理在流行的.NET JSON框架牛頓軟件中,這可以通過稱為“類型名稱處理”的東西來解決,或者可以使用自定義Json轉(zhuǎn)換器來解決。該框架將在根級別向序列化/封送處理的 JSON 添加類似魔術(shù)鍵的東西,然后用于確定反序列化/取消封送處理的原始類型。"$type"手術(shù)室中的多態(tài)性1 當(dāng)具有相同基數(shù)的多個(gè)類型的實(shí)例保存在同一表中時(shí),在 ORM 中的術(shù)語“多態(tài)性”下也會出現(xiàn)類似的情況。通常引入一個(gè)鑒別器列,因此在上面的示例中名稱。
查看完整描述

1 回答

?
皈依舞

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超3個(gè)贊

您可以實(shí)現(xiàn)自定義 json。解咒者。為此,您需要使用命名切片類型,而不是未命名的 .[]MyInterface

在自定義取消封口實(shí)現(xiàn)中,您可以將 JSON 數(shù)組解封為切片,其中切片的每個(gè)元素都是一個(gè) json。表示相應(yīng) JSON 對象的原始消息。之后,您可以迭代原始消息切片。在循環(huán)中,從每個(gè)原始消息中僅取消編組字段,然后使用該字段的值來確定可以將完整原始消息解封到的正確類型,最后取消編組完整消息并將結(jié)果添加到接收方。DiscriminatorDiscriminator

type MyInterfaceSlice []MyInterface


func (s *MyInterfaceSlice) UnmarshalJSON(data []byte) error {

    array := []json.RawMessage{}

    if err := json.Unmarshal(data, &array); err != nil {

        return err

    }


    *s = make(MyInterfaceSlice, len(array))

    for i := range array {

        base := BaseStruct{}

        data := []byte(array[i])

        if err := json.Unmarshal(data, &base); err != nil {

            return err

        }


        var elem MyInterface

        switch base.Discriminator {

        case "Foo":

            elem = new(Foo)

        case "Bar":

            elem = new(Bar)

        }

        if elem == nil {

            panic("whoops")

        }


        if err := json.Unmarshal(data, elem); err != nil {

            return err

        }

        (*s)[i] = elem

    }

    return nil

}

https://play.golang.org/p/mXiZrF392aV


查看完整回答
反對 回復(fù) 2022-10-04
  • 1 回答
  • 0 關(guān)注
  • 120 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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