在go websocket服务器上获取json数据

Sam*_*oog 4 json go websocket

当我从 js 客户端发送socket.send('{"text":"111"}')并在服务器上获取此数据时,websocket.JSON.Receive(ws, &data)数据保持为空。我使用“golang.org/x/net/websocket”

type (
    Msg struct {
        clientKey string
        text string
    }

    NewClientEvent struct {
        clientKey string
        msgChan chan *Msg
    }

    Item struct {
        text string
    }
)

var (
    clientRequests = make(chan *NewClientEvent, 100)
    clientDisconnects = make(chan string, 100)
    messages = make(chan *Msg, 100)
)

func ChatServer(ws *websocket.Conn) {
    msgChan := make(chan *Msg, 100)
    clientKey := time.Now().String()

    clientRequests <- &NewClientEvent{clientKey, msgChan}
    defer func(){ clientDisconnects <- clientKey}()

    go func(){
        for msg := range msgChan{
            ws.Write([]byte(msg.text))
        }
    }()
    for {
        var data Item
        err := websocket.JSON.Receive(ws, &data)
        if err != nil {
            log.Println("Error: ", err.Error())
            return
        }
        messages <- &Msg{clientKey, data.text}
    }
}
Run Code Online (Sandbox Code Playgroud)

但如果我尝试socket.send('"text"')通过以下方式发送和获取它:

var data string
err := websocket.JSON.Receive(ws, &data)
            if err != nil {
                log.Println("Error: ", err.Error())
                return
            }
            messages <- &Msg{clientKey, data}
Run Code Online (Sandbox Code Playgroud)

一切正常。

Dat*_*sik 5

很可能您需要先定义结构,然后才能JSON.receive在像这样的对象上使用

{ "text": "Hi" }

type socketData struct {
    Text string `json:"text"`
}
Run Code Online (Sandbox Code Playgroud)

然后

data := &socketData{}

websocket.JSON.receive(ws, &data)

log.Println(data.Text) // Hi
Run Code Online (Sandbox Code Playgroud)

如果您要发送随机数据,而您无法真正为其定义结构(尽管这是首选方法),您只需声明一个interface{}

var data map[string]interface{}

log.Println(data["text"].(string)) // Hi
Run Code Online (Sandbox Code Playgroud)

http://play.golang.org/p/Jp5qKtiUGw

  • @SamuelLoog我还没有看过源代码,但我确信`JSON.receive`在其源代码中调用了`json.Unmarshal`,其中`json.Unmarshal`需要通过使用大写字母来导出结构字段它们的属性,因此如果您使用“文本字符串”,它将不起作用,但“文本字符串”会被导出,因此它可以工作 (4认同)