我一直试图从PubNub解析此JSON消息,但没有任何运气:
type PubNubMessage struct { body []string } [[{"text":"hey"}],"1231212412423235","channelName"] json: cannot unmarshal array into Go value of type main.PubNubMessage
有没有人知道如何在golang中解码这种复杂类型?
简短的答案是,您不能直接将非同类型的JSON数组(按您的示例)解组到golang结构中。
长答案是,您应该为PubNubMessage类型定义一个(m *PubNubMessage) UnmarshalJSON([]byte) error方法,该方法将JSON字符串解组为an interface{},然后使用类型断言来确保所需的格式并填充结构。
(m *PubNubMessage) UnmarshalJSON([]byte) error
interface{}
例如:
type TextMessage struct { Text string } type PubNubMessage struct { Messages []TextMessage Id string Channel string } func (pnm *PubNubMessage) UnmarshalJSON(bs []byte) error { var arr []interface{} err := json.Unmarshal(bs, &arr) if err != nil { return err } messages := arr[0].([]interface{}) // TODO: proper type check. pnm.Messages = make([]TextMessage, len(messages)) for i, m := range messages { pnm.Messages[i].Text = m.(map[string]interface{})["text"].(string) // TODO: proper type check. } pnm.Id = arr[1].(string) // TODO: proper type check. pnm.Channel = arr[2].(string) // TODO: proper type check. return nil } // ... jsonStr := `[[{"text":"hey"},{"text":"ok"}],"1231212412423235","channelName"]` message := PubNubMessage{} err := json.Unmarshal([]byte(jsonStr), &message)