如何将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)
错误分析
你的代码存在两个关键问题:
json.Marshal参数错误:应传入结构体实例state,而非类型myStruct- 参数类型不匹配:
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
相关产品推荐
相关产品推荐

