登录
首页 >  Golang >  Go问答

使用 JSON 格式传递消息通过 PubSub 实现

来源:stackoverflow

时间:2024-03-09 19:30:27 119浏览 收藏

在Golang实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天golang学习网就整理分享《使用 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
}

但是每次我在云功能日志中收到错误:

“com.google.gson.jsonsyntaxexception:java.lang.illegalstateexception:预期为 begin_object,但为 string”

如果您对如何解决这个问题有任何想法,我将不胜感激。

  • 订阅交付类型:推送

  • 云函数触发器:主题


解决方案


这并不是一个真正的 go 问题,而是一个 nodejs 问题。尽管问题完全缺少云函数的代码,但我仍然可以看出它出了什么问题:由于您推送的是字符串而不是 json,因此您必须使用 json.parse(string); 才能在其上使用 gson .

如果您想要 go 答案,您可能需要首先推送 json。

在 go 中,可以使用 json.Marshal() 编码 json(data 对象 可以定义为 struct):

type Message struct {
    source string
    data object
}
msg := Message{ ... }
payload, err := json.Marshal(msg)

在哪一端解决通过推送 json 字符串而不是 json 所产生的问题并不重要。第二种方法可能比第一种方法好一点(就已经提供了预期的格式而言,而不是稍后再搞乱)。这是基于 json 和 json 字符串不是同一件事(即使内容相同)。

以上就是《使用 JSON 格式传递消息通过 PubSub 实现》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>