开发者社区 > 云原生 > 云消息队列 > 正文

MQTT中查询这样的非标准的json返回数据给golang解析带来了很大困扰,请问下怎么处理?

MQTT中查询rocketmq的admin api,ExamineConsumeStats

rocketmq返回的内容:

{"consumeTps":0.0,"offsetTable":{{"brokerName":"broker-a","queueId":7,"topic":"evidence-sync-cloud"}:{"brokerOffset":0,"consumerOffset":0,"lastTimestamp":0}}}

可以看到在offsetTable里面的数据并不是标准的json。

查看了rocketmq的源码,发现定义的是一个以MessageQueue为key的HashMap:

private HashMap<MessageQueue, OffsetWrapper> offsetTable = new HashMap();

这样的非标准的json返回数据给golang解析带来了很大困扰,请问下怎么处理这样的数据,ExamineConsumeStats这个API返回的数据的问题,求救大家如何解决的

展开
收起
真的很搞笑 2023-05-16 17:49:02 341 0
2 条回答
写回答
取消 提交回答
  • 值得去的地方都没有捷径

    可以考虑使用golang中的json.RawMessage类型来暂时保存这个非标准的JSON数据,在需要使用时再进行具体的解析操作。

    步骤如下:

    定义结构体来表示ExamineConsumeStats的返回数据: type ConsumeStats struct { ConsumeTps float64 OffsetTable map[string]json.RawMessage } 在解析ExamineConsumeStats的返回数据时,使用json.RawMessage类型来保存offsetTable字段的值: consumeStats := ConsumeStats{} err := json.Unmarshal(response, &consumeStats) 在需要使用offsetTable字段时,进行具体的解析操作: for key, value := range consumeStats.OffsetTable { offsetWrapper := OffsetWrapper{} err := json.Unmarshal([]byte(value), &offsetWrapper) // Do something with the offsetWrapper object } 使用这种方法,可以方便地暂时保存非标准的JSON数据,并在需要使用时进行具体的解析操作。

    2023-05-23 08:50:26
    赞同 展开评论 打赏
  • 公众号:网络技术联盟站,InfoQ签约作者,阿里云社区签约作者,华为云 云享专家,BOSS直聘 创作王者,腾讯课堂创作领航员,博客+论坛:https://www.wljslmz.cn,工程师导航:https://www.wljslmz.com

    阿里云MQ的RocketMQ的Admin API返回的数据确实不是标准的JSON格式,而是一种类似于Map的数据结构。如果您使用Golang进行解析,可以使用Golang的map类型来处理该数据。

    具体步骤如下:

    1. 使用Golang的HTTP库发送ExamineConsumeStats请求,并获取返回的结果。

    2. 将返回的结果转换成map类型。可以使用Golang的json库中的Unmarshal函数,将返回结果转换成byte数组,再使用Golang的map类型进行解析。示例代码如下:

    import (
        "encoding/json"
        "fmt"
    )
    
    func main() {
        // 假设返回的结果为resultStr
        resultStr := `{"consumeTps":0.0,"offsetTable":{{"brokerName":"broker-a","queueId":7,"topic":"evidence-sync-cloud"}:{"brokerOffset":0,"consumerOffset":0,"lastTimestamp":0}}}`
    
        // 将结果转换成byte数组
        resultBytes := []byte(resultStr)
    
        // 定义一个空的map类型
        resultMap := make(map[string]interface{})
    
        // 解析byte数组
        err := json.Unmarshal(resultBytes, &resultMap)
        if err != nil {
            fmt.Println("解析结果失败:", err)
            return
        }
    
        // 打印解析结果
        fmt.Println("解析结果:", resultMap)
    }
    

    由于该数据结构比较复杂,因此在解析时需要进行多层嵌套,具体解析方式需要根据实际情况进行调整。

    2023-05-16 18:33:33
    赞同 展开评论 打赏

涵盖 RocketMQ、Kafka、RabbitMQ、MQTT、轻量消息队列(原MNS) 的消息队列产品体系,全系产品 Serverless 化。RocketMQ 一站式学习:https://rocketmq.io/

相关产品

  • 云消息队列 MQ
  • 相关电子书

    更多
    阿里开发者手册-Golang专题 立即下载
    RocketMQ Summit 2022 开源生态发展 立即下载
    Golang 微服务在腾讯游戏用户运营领域的探索及实践 立即下载

    相关镜像