Go - 编码嵌套结构

时间:2015-10-28 15:42:13

标签: json go

我正致力于http://gary.burd.info/go-websocket-chat的扩展。

此示例通过websockets发送原始文本。

我想改用JSON数据。

我在Go代码中做了一些结构,但当我将其转换为JSON以将其写入客户端时,嵌套结构不在结果中。

一些代码:

type(
    ChatroomData struct {
        Token string `json:"token"`
        Chatroom *Chatroom `json:"chatroom"`
    }
    Message struct {
        Token string `json:"token,omitempty"`
        Type string `json:"type"`
        Author string `json:"author"`
        Content string `json:"content"`
        Chatroom string `json:"chatroom"`
    }
    Messages []Message
)

聊天室结构:

Chatroom struct {
    Name string `json:"name"`
    Users []User `json:"users"`
    Messages Messages `json:"messages"`
    Hub *WsHub `json:"-"`
}
Chatrooms map[string]*Chatroom
User struct {
    username string `json:"username"`
    token string `json:"-"`
}
Users []User

启动聊天室:

func (s *Server) startMainChatroom() {
    s.Chatrooms["main"] = &Chatroom{
        Name: "main",
        Users: make([]User, 0),
        Messages: make([]Message, 0),
        Hub: NewHub(),
    }
    go s.Chatrooms["main"].Hub.Run()
}

将消息附加到聊天室的方式:

message := Message{}
json.Unmarshal([]byte(data), &message)
message.Token = ""
message.Type = "message"
chatroom.Messages = append(chatroom.Messages, message)

将数据发送到客户端:

func (u *User) SendChatroomData(w http.ResponseWriter, c *Chatroom, status int) {
    chatroomData := ChatroomData{Token: u.token, Chatroom: c}

    w.Header().Set("Access-Control-Allow-Origin", "*")
    w.Header().Set("Access-Control-Allow-Headers", "accept, authorization")
    w.Header().Set("Access-Control-Allow-Methods", "GET, POST")
    w.WriteHeader(status)
    if err := json.NewEncoder(w).Encode(&chatroomData); err != nil {
        panic(err)
    }
}

打印结果为:

{
     "token":"a638ed3ba0c30ba3d0810fc79e12a50a",
     "chatroom":{
         "name":"main",
         "users":[{},{}],
         "messages":[]
     }
}

发送了两个用户和三封邮件。如果我使用fmt.Printf("%v\n", chatroom.Messages),我会正确存储三条消息。对于用户来说,当我转储数据时,数据就在这里。

很多事情很奇怪:

  • 为什么messages键保持空白?
  • 为什么users键没有,但切片项是空的?由Mike Reedell解决

感谢您的帮助,如果需要,请不要再向我提出更多代码。我希望我的帖子已经太长了(并没有太多的英语错误X))!

2 个答案:

答案 0 :(得分:1)

go JSON编组程序仅输出导出(大写)字段。 User结构中的字段是未导出的(小写),这意味着JSON封送程序不知道它们在那里并且无法输出它们。

答案 1 :(得分:0)

问题完全在别处:由于我对指针的误解,我在添加一些消息时使用的聊天室实例没有正确绑定到s.Chatrooms["main"]

当我整理s.Chatrooms["main"]时,消息不在里面!

Ty为你提供帮助!

我希望这会帮助其他一些学习者:D