英文:
Go websocket serialization/deserialization json
问题
我正在使用golang的websocket库gorilla,并计划使用json进行序列化/反序列化。
假设我有以下结构体来接收传入的消息:
type Foo struct {
A string `json:"a"`
B string `json:"b"`
}
type Bar struct {
C string `json:"c"`
D string `json:"d"`
}
gorilla提供了conn.ReadJSON
方法来接收传入的消息。传入的消息可以是Foo或Bar,但我不能使用conn.ReadJSON(Foo)
并监听其他conn.ReadJSON(Bar)
,这会很混乱。我希望像JavaScript中的JSON.parse()
一样,只使用conn.ReadJSON(Messages)
。如何处理传入的消息:如果接收到Foo,则存储到Foo结构体中;如果接收到Bar,则存储到Bar结构体中?
我考虑使用以下结构体来解决问题:
type Messages struct {
Control string `json:"control"`
X json.RawMessage
}
现在传入的消息有一个json控制字段,控制字段的值可以是Foo或Bar。使用if else
语句,如果control等于Foo,则将X
赋值给Foo;否则将X
赋值给Bar。但是我无法确定X
的数据类型。
欢迎提供任何解决方案,谢谢。
英文:
I'm using gorilla websocket, and i'm planing using json for serialization/deserialization.
Let say i have struct like this for receive the incoming messages:
type Foo struct {
A string `json:"a"`
B string `json:"b"`
}
and
type Bar struct {
C string `json:"c"`
D string `json:"d"`
}
gorilla provide conn.ReadJSON
for receive incoming messages. The incoming messages can be Foo or Bar but i can't use conn.ReadJSON(Foo)
and listen for other conn.ReadJSON(Bar)
, it's a mess. I want something like just conn.ReadJSON(Messages)
, like JSON.parse()
in javascript. How to handle incoming messages if Foo is received, then it stored into Foo
struct, and if Bar is received then it stored into Bar
struct ?
I'm thingking the solution is using this struct:
type Messages struct {
Control string `json:"control"`
X // Data type for either Foo or Bar struct
}
The incoming messages now have json control, value of control can be Foo or Bar. Using if else
if control==Foo then X
is assign to Foo, else X
is assign to Bar. But i can't figured the data type for X
.
Any sollution is welcome, thankyou.
答案1
得分: 4
使用RawMessage。
type Messages struct {
Control string `json:"control"`
X json.RawMessage
}
var m Messages
err := c.ReadJSON(&m)
if err != nil {
// 处理错误
}
switch m.Control {
case "Foo":
var foo Foo
if err := json.Unmarshal([]byte(m.X), &foo); err != nil {
// 处理错误
}
// 使用 foo 做一些操作
case "Bar":
... 按照 Foo 的模式处理
}
英文:
Use RawMessage.
type Messages struct {
Control string `json:"control"`
X json.RawMessage
}
var m Messages
err := c.ReadJSON(&m)
if err != nil {
// handle error
}
switch m.Control {
case "Foo":
var foo Foo
if err := json.Unmarshal([]byte(m.X), &foo); err != nil {
// handle error
}
// do something with foo
case "Bar":
... follow pattern for Foo
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论