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

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

Golang 自定義 JSON 序列化(對于 json 是否存在與 gob.register()

Golang 自定義 JSON 序列化(對于 json 是否存在與 gob.register()

Go
森林海 2022-01-04 10:00:59
使用 json 編碼/解碼時,有沒有辦法序列化自定義結(jié)構(gòu)?假設(shè)您有 3 個(在我的實際代碼中有 10 個)不同的自定義結(jié)構(gòu),它們通過 udp 發(fā)送,并且您使用 json 進行編碼:type a struct {   Id   int   Data msgInfo}type b struct {   Id       int   Data     msgInfo   Other    metaInfo}type c struct {   Other    metaInfo}在接收端,您想知道接收到的結(jié)構(gòu)體是 a、b 或 c 類型,因此它可以例如傳遞到類型特定的通道。type msgtype reflect.Type..nrOfBytes, err := udpConn.Read(recievedBytes)if err != nil {...}var msg interface{}err = json.Unmarshal(recievedBytes[0:nrOfBytes], &msg)if err != nil {...}u := reflect.ValueOf(msg)msgType := u.Type()fmt.Printf("msg is of type: %s\n", msgType)使用 gob,這很容易通過注冊類型來完成,但我必須使用 json,因為它是通過 udp 進行通信的,所以無論如何要序列化自定義結(jié)構(gòu)?我想要打印msg is of type: a但我只是得到msg is of type: map[string]interface {}
查看完整描述

2 回答

?
RISEBY

TA貢獻1856條經(jīng)驗 獲得超5個贊

您可以做的一件事是使用json.RawMessage類型和自定義包裝器類型。然后,在收到消息后,您可以進行切換(或使用構(gòu)造函數(shù)映射)來獲取正確的結(jié)構(gòu)。


例如(省略錯誤檢查):


package main


import (   

    "encoding/json"

    "fmt"  

)          


type Message struct {

    Type string

    Data json.RawMessage

}          


func (m Message) Struct() interface{} {

    unmarshaller, found := unmarshallers[m.Type]

    if !found {

        return nil

    }      

    return unmarshaller([]byte(m.Data))

}          


type Foo struct {

    ID int 

}          


var unmarshallers = map[string]func([]byte) interface{}{

    "foo": func(raw []byte) interface{} {

        var f Foo

        json.Unmarshal(raw, &f)

        return f

    },     

}          


func main() {

    var body = []byte(`{"Type":"foo","Data":{"ID":1}}`)

    var msg Message

    json.Unmarshal(body, &msg)


    switch s := msg.Struct().(type) {

    case Foo:

        fmt.Println(s)

    }      

}

請參閱此游樂場示例以獲取現(xiàn)場演示http://play.golang.org/p/7FmQqnWPaE


查看完整回答
反對 回復(fù) 2022-01-04
?
瀟瀟雨雨

TA貢獻1833條經(jīng)驗 獲得超4個贊

根據(jù)您的評論,這可能是一個解決方案:


type Packet {

  Type string

  Data []byte

}

編碼功能:


func packageEncode(i interface{}) ([]byte, error) {

  b, err := json.Marshal(i)

  if err != nil {

    return nil, err

  }


  p := &Package{Data: b}

  switch t.(type) {

    case a:

      p.Type = "a"

    case b:

      p.Type = "b"

    case c:

      p.Type = "c"

  }

  return json.Marshal(p)

}

然后,當收到消息并解碼時:


p := &Package{}

err = json.Unmarshal(recievedBytes[0:nrOfBytes], p)

...

if p.Type == "a" {

  msg := &a{}

  err = json.Unmarshal(p.Data, msg)

}


if p.Type == "b" {

  ...

}


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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