You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言如何从Kafka REST Proxy返回消息中提取value字段映射到结构体

解决方法

定义匹配JSON结构的结构体

首先声明两层结构体,分别对应返回的外层Kafka记录和你需要提取的value业务字段:

import "encoding/json"

// 自定义业务结构体,对应返回结果中value字段的结构
type AdoptionValue struct {
    AdoptionID string `json:"AdoptionID"`
    IPAddress  string `json:"IPAddress"`
    Port       string `json:"Port"`
    Status     string `json:"Status"`
}

// 外层结构体,对应Kafka REST代理返回的单条消息记录
type KafkaRecord struct {
    Topic     string        `json:"topic"`
    // 不需要的字段可以不用声明,JSON解码会自动忽略
    Value     AdoptionValue `json:"value"`
    Partition int           `json:"partition"`
    Offset    int64         `json:"offset"`
}

修改响应解析逻辑

不要用bufio.Scanner逐行扫描,直接用Go标准库的JSON解码器读取整个响应体完成映射:

// 原有请求构造逻辑保持不变
req, err := http.NewRequest(http.MethodGet, fmt.Sprintf(FETCH_CONSUMER, URL, GROUP, CONSUMER), nil)
if err != nil {
    panic(err)
}
req.Header.Add("Accept", CONTENT_TYPE)
respRecords, err := client.Do(req)
if err != nil {
    panic(err)
}
defer respRecords.Body.Close()
fmt.Printf("Response %s\n", respRecords.Status)

// 直接解码响应体到结构体数组
var records []KafkaRecord
if err = json.NewDecoder(respRecords.Body).Decode(&records); err != nil {
    panic(fmt.Errorf("JSON解码失败: %w", err))
}

// 遍历提取value字段映射后的结构体
for _, record := range records {
    businessData := record.Value
    // 此处可直接使用结构体的字段做业务逻辑处理
    fmt.Printf("业务数据:%+v\n", businessData)
}

注意事项

  • 结构体所有字段首字母必须大写,否则JSON包无法访问私有字段,会出现解码后字段全为零值的问题
  • 如果value字段可能为空,可以将KafkaRecord中Value的类型改为*AdoptionValue,避免空值解码报错
  • 不需要用到的返回字段(比如示例中的key)无需在结构体中声明,解码时会自动忽略

内容的提问来源于stack exchange,提问作者AR7

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 09:57:02