gpt4 book ai didi

json - 使用 golang JSON 解码 PubNub 消息

转载 作者:IT王子 更新时间:2023-10-29 01:45:50 25 4
gpt4 key购买 nike

我一直在尝试从 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 结构。

长答案是你应该定义一个 (m *PubNubMessage) UnmarshalJSON([]byte) error method对于您的 PubNubMessage 类型,它将 JSON 字符串解码为一个接口(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)

关于json - 使用 golang JSON 解码 PubNub 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29348262/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com