Go websocket 序列化/反序列化 json

Posted

技术标签:

【中文标题】Go websocket 序列化/反序列化 json【英文标题】:Go websocket serialization/deserialization json 【发布时间】:2016-12-13 00:32:41 【问题描述】:

我正在使用gorilla websocket,我正在计划使用 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),这是一团糟。我想要像 conn.ReadJSON(Messages) 这样的东西,比如 javascript 中的 JSON.parse()。如果收到Foo,如何处理传入的消息,然后将其存储到Foo struct,如果收到Bar,则将其存储到Bar struct 中?

我认为解决方案是使用这个结构:

type Messages struct 
    Control string `json:"control"`
    X // Data type for either Foo or Bar struct

传入的消息现在有 json 控件,控件的值可以是 Foo 或 Bar。使用if else if control==Foo 然后X 分配给Foo,否则X 分配给Bar。但我不知道X 的数据类型。

欢迎任何解决方案,谢谢。

【问题讨论】:

【参考方案1】:

使用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


【讨论】:

感谢您的快速回答,这对我很有帮助。解决方案在encoding/json 中,我意识到在询问之前我需要阅读更多内容,再次感谢您。

以上是关于Go websocket 序列化/反序列化 json的主要内容,如果未能解决你的问题,请参考以下文章

使用ws通过websocket发送对象:无法反序列化

JSON 序列化和反序列化 In Go

JSON 序列化和反序列化 In Go

Json序列化与反序列化

go 语言的序列化与反序列化

Json序列化与反序列化