doumou8527 2015-03-30 14:03
浏览 48
已采纳

使用golang JSON解码PubNub消息

I've been trying to parse this JSON message from PubNub without any luck:

type PubNubMessage struct {
    body []string
}

[[{"text":"hey"}],"1231212412423235","channelName"]
json: cannot unmarshal array into Go value of type main.PubNubMessage

Does anyone have an idea on how to decode such complex types in golang?

  • 写回答

4条回答 默认 最新

  • douyunjiaok300404 2015-03-30 15:15
    关注

    The short answer is that you cannot directly unmarshal a JSON array of non-homogenous types (per your example) into a golang struct.

    The long answer is that you should define an (m *PubNubMessage) UnmarshalJSON([]byte) error method for your PubNubMessage type which unmarshals the JSON string into an interface{} and then uses type assertions to ensure the expected format and populates the structure.

    For example:

    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)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题