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

如何将Go结构体转为含json.RawMessage的结构体传入SDK方法

Go中如何将自定义结构体传入OpenAPI生成的SDK方法

问题背景

你使用OpenAPI规范生成的Go SDK包含以下类型和方法(已简化):

type CreatePlan struct {
  union json.RawMessage
}

type CreateApiPlanJSONResponseBody = CreatePlan

func (c *MyClient) CreateApiPlan(body CreateApiPlanJSONResponseBody) {…}

你有一个符合方法预期格式的自定义结构体myStruct,尝试传入CreateApiPlan方法时代码报错,你的错误尝试代码如下:

var state *myStruct
// 假设state已包含正确数据

jsonData, _ := json.Marshal(myStruct)

resp, err := client.CreateApiPlan(*jsonData)

错误分析

你的代码存在两个关键问题:

  1. json.Marshal参数错误:应传入结构体实例state,而非类型myStruct
  2. 参数类型不匹配:CreateApiPlan要求传入CreateApiPlanJSONResponseBody(即CreatePlan)类型,你直接传递了[]byte的解引用值(*jsonData是单个byte,完全不符合方法参数要求)

正确实现代码

在不修改SDK生成的方法或类型定义的前提下,正确的传递方式如下:

var state *myStruct
// 假设state已正确初始化并填充数据

// 1. 将自定义结构体序列化为JSON字节数组
jsonData, err := json.Marshal(state)
if err != nil {
    // 实际业务中请替换为合理的错误处理逻辑
    log.Fatalf("序列化失败: %v", err)
}

// 2. 构造SDK要求的请求体类型
requestBody := CreateApiPlanJSONResponseBody{
    union: json.RawMessage(jsonData),
}

// 3. 调用SDK方法
resp, err := client.CreateApiPlan(requestBody)
// 处理返回结果和错误
if err != nil {
    // 处理调用错误
}

原理说明

json.RawMessage是Go标准库中[]byte的别名,SDK生成的CreatePlan结构体通过union字段接收原始JSON数据。因此只需将自定义结构体序列化后的[]byte转换为json.RawMessage,再赋值给CreatePlan的union字段,即可构造出符合要求的参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 06:02:42