如何解决JSON数据作为PubSub的消息
我已经根据Google的“向主题发布消息”指南编写了以下代码:
import (
"context"
"fmt"
"io"
"cloud.google.com/go/pubsub"
)
func publishMessage(w io.Writer,projectID,topicID) error {
msg := `{
"source":"test_source","data": {
"jobId": "123","recordCount": 10000
}
}`
ctx := context.Background()
client,err := pubsub.NewClient(ctx,projectID)
if err != nil {
return fmt.Errorf("pubsub.NewClient: %v",err)
}
t := client.Topic(topicID)
result := t.Publish(ctx,&pubsub.Message{Data: []byte(msg)})
id,err := result.Get(ctx)
if err != nil {
return fmt.Errorf("Get: %v",err)
}
fmt.Fprintf(w,"Published a message; msg ID: %v\n",id)
return nil
}
但是每次我在Cloud Function的日志中收到错误时:
“ com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:预期为BEGIN_OBJECT,但为STRING”
如果您有任何解决办法的想法,我将不胜感激。
-
订阅交付类型:推送
-
云功能触发器:主题
解决方法
这实际上不是Go问题,而是NodeJS问题。尽管问题完全缺少Cloud Function的代码,但我仍然可以说出问题所在:由于您要推送字符串而不是JSON,因此必须先使用JSON.parse(string);
,然后才能在其上使用GSON。>
如果您想获得答案,则可能首先需要推送JSON。
在Go语言中,您可以使用json.Marshal()
(可以将data object
定义为struct
)来编码JSON:
type Message struct {
source string
data object
}
msg := Message{ ... }
payload,err := json.Marshal(msg)
在哪一端修复通过推送JSON字符串而不是JSON所产生的问题并不重要。第二种方法可能比第一种更好(就已经提供了预期的格式而言,而不是稍后再搞乱)。这是基于JSON和JSON字符串不是同一件事(即使内容相同)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。