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 offsetTable = new HashMap();
这样的非标准的json返回数据给golang解析带来了很大困扰,请问下怎么处理这样的数据,ExamineConsumeStats这个API返回的数据的问题,求救大家如何解决的
可以考虑使用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数据,并在需要使用时进行具体的解析操作。
阿里云MQ的RocketMQ的Admin API返回的数据确实不是标准的JSON格式,而是一种类似于Map的数据结构。如果您使用Golang进行解析,可以使用Golang的map类型来处理该数据。
具体步骤如下:
使用Golang的HTTP库发送ExamineConsumeStats请求,并获取返回的结果。
将返回的结果转换成map类型。可以使用Golang的json库中的Unmarshal函数,将返回结果转换成byte数组,再使用Golang的map类型进行解析。示例代码如下:
由于该数据结构比较复杂,因此在解析时需要进行多层嵌套,具体解析方式需要根据实际情况进行调整。