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

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

在 Golang 中解碼任意 JSON

在 Golang 中解碼任意 JSON

Go
忽然笑 2021-10-04 17:15:15
我有一個(gè)關(guān)于在 Go 中解碼任意 JSON 對(duì)象/消息的問(wèn)題。例如,您可以通過(guò) http 連接接收三個(gè)截然不同的 JSON 對(duì)象(又名消息),為了說(shuō)明起見,讓我們調(diào)用它們:{ home : { some unique set of arrays, objects, fields, and arrays objects } }和{ bike : { some unique set of arrays, objects, fields, and arrays objects } }和{ soda : { some unique set of arrays, objects, fields, and arrays objects } }我在想的是,您可以將這些從 http 連接解碼為接口映射,例如:func httpServerHandler(w http.ResponseWriter, r *http.Request) {    message := make(map[string]interface{})    decoder := json.NewDecoder(r.Body)    _ = decoder.Decode(&message)然后執(zhí)行 if, else if 塊以查找有效的 JSON 消息if _, ok := message["home"]; ok {    // Decode interface{} to appropriate struct} else if _, ok := message["bike"]; ok {    // Decode interface{} to appropriate struct} else {    // Decode interface{} to appropriate struct}現(xiàn)在在 if 塊中,如果我重新解碼整個(gè)包,我可以讓它工作,但我認(rèn)為這是一種浪費(fèi),因?yàn)槲乙呀?jīng)部分解碼了它并且只需要解碼地圖的值,這是一個(gè)interface{},但我似乎無(wú)法讓它正常工作。但是,如果我執(zhí)行以下操作,其中 homeType 是一個(gè)結(jié)構(gòu)體,則重新解碼整個(gè)事情是可行的:var homeObject homeTypevar bikeObject bikeTypevar sodaObject sodaType然后在 if 塊中執(zhí)行:if _, ok := message["home"]; ok {    err = json.Unmarshal(r.Body, &homeObject)    if err != nil {        fmt.Println("Bad Response, unable to decode JSON message contents")        os.Exit(1)    }因此,如果無(wú)需再次對(duì)整個(gè)內(nèi)容重新解碼/解組,您如何使用地圖中的接口{}?
查看完整描述

1 回答

?
楊魅力

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

如果您有類似 map[string]interface{} 的東西,那么您可以使用類型斷言訪問(wèn)這些值,例如


home, valid := msg["home"].(string)

if !valid {

    return

}

這適用于簡(jiǎn)單的值。對(duì)于更復(fù)雜的嵌套結(jié)構(gòu),您可能會(huì)發(fā)現(xiàn)json.RawMessage使用自定義json.Unmarshaler. 有關(guān)非常詳細(xì)的討論,請(qǐng)參閱this。


另一個(gè)想法可能是定義一個(gè)Message由指向 Home、Bike 和 Soda 結(jié)構(gòu)的指針組成的自定義類型。如


type Home struct {

    HomeStuff     int

    MoreHomeStuff string


type Bike struct {

    BikeStuff int

}


type Message struct {

    Bike *Bike `json:"Bike,omitempty"`

    Home *Home `json:"Home,omitempty"`

}

如果您將這些設(shè)置為省略 if nil,則解組應(yīng)該只填充相關(guān)的。你可以在這里玩它。


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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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