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 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测