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 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀