我有一个端点,可以从Google PubSub请求中接收数据。根据{{3}},对象如下:
type pushRequest struct {
Message struct {
Attributes map[string]string
Data []byte
ID string `json:"message_id"`
}
Subscription string
}
数据字段的格式如下:
type Data struct {
Key string `json:"key"`
Body string `json:"body"`
Meta map[string]interface{} `json:"meta"`
}
我可以通过以下方式明确解组JSON请求:
f := &pushRequest{}
json.Unmarshal(msg, &f)
离开[]字节字段。根据文档
,我可以做这样的事情来转换为字符串messages = append(messages, string(f.Message.Data))
这对我没有帮助,因为我需要它作为结构。
我可以再次解组数组:
var m Data
json.Unmarshal(f.Message.Data, &m)
尝试将pushRequest结构中的字段类型更改为Data但未成功。空白...
有没有办法可以一次性解开东西?做两次似乎很荒谬。
如果它很明显,我就是看不到它!
答案 0 :(得分:1)
这是我的云函数的一个片段,它用作发布/订阅推送端点。关键是您首先必须使用 PushRequest
结构对主体进行解码。接下来,您可以将消息数据转换为结构体。根据 documentation,Data
中的 Message
字段是 base-64 编码字符串,因此您必须先对其进行解码。
type PushRequest struct {
Message pubsub.PubsubMessage `json:"message"`
Subscription string `json:"subscription"`
}
type Example struct {
ID string `json:"id" firestore:"id"`
}
func HTTPEndpoint(w http.ResponseWriter, r *http.Request) {
var pr common.PushRequest
if err := json.NewDecoder(r.Body).Decode(&pr); err != nil {
log.Fatalf("Could not decode body: %v", err)
return
}
data, err := base64.StdEncoding.DecodeString(pr.Message.Data)
if err != nil {
log.Fatalf("Base64: %v", err)
return
}
var example Example
if err := json.Unmarshal(data, &example); err != nil {
log.Fatalf("Json: %v", err)
return
}
// Do something useful with the struct
}
答案 1 :(得分:0)
decoder := json.NewDecoder(r.Body)
psmsg := &PushRequest{}
decoderErr := decoder.Decode(&psmsg)
if decoderErr != nil {
// Error...
return
}
data := Data{}
unmarshalErr := json.Unmarshal([]byte(string(psmsg.Message.Data)), &data)
if unmarshalErr != nil {
// Error...
return
}