我一直试图从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{}
,然后使用类型断言来确保所需的格式并填充结构。
例如:
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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句