2 回答

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

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" {
...
}
- 2 回答
- 0 關(guān)注
- 185 瀏覽
添加回答
舉報