Go语言通用API响应包装求助:适配多种JSON响应格式
通用JSON响应包装方案(适配任意JSON格式)
你可以用json.RawMessage来实现通用包装,它能直接保留API返回的原始JSON字节,不需要提前解析成特定结构,完美适配数组、对象、嵌套JSON等任意格式。
解决步骤:
定义带JSON标签的通用结构体
注意给字段加上json标签,确保输出的键是小写的data和statusCode,和你要求的格式完全匹配:import "encoding/json" type CommonResponse struct { Data json.RawMessage `json:"data"` StatusCode int `json:"statusCode"` }直接复用API响应的原始字节
不管API返回的是数组还是单个对象,直接把响应的[]byte赋值给Data字段,再序列化整个结构体即可:- 处理JSON数组响应的示例:
// 假设apiResponse是从API拿到的原始字节数组,比如[]byte(`[{"name":"Harry Potter","city":"London"},{"name":"Don Quixote","city":"Madrid"}]`) resp := CommonResponse{ Data: apiResponse, StatusCode: 200, } out, err := json.Marshal(resp) if err != nil { // 自行处理错误逻辑 } // 最终输出: // {"data":[{"name":"Harry Potter","city":"London"},{"name":"Don Quixote","city":"Madrid"}],"statusCode":200} - 处理单个JSON对象响应的示例:
// 假设apiResponse是单个对象的字节数组,比如[]byte(`{"name":"Alice","age":30}`) resp := CommonResponse{ Data: apiResponse, StatusCode: 200, } out, err := json.Marshal(resp) if err != nil { // 自行处理错误逻辑 } // 最终输出: // {"data":{"name":"Alice","age":30},"statusCode":200}
- 处理JSON数组响应的示例:
为什么这个方案可行?
json.RawMessage本质是[]byte的别名,序列化时会直接输出原始JSON字节,不会像字符串那样被二次转义;- 不需要提前判断响应是数组还是对象,省去分支处理的麻烦,完全通用;
- 保留了API响应的原始结构,不会出现解析丢失或格式变形的问题。
对比你之前的问题:
- 用
Model[string]时,JSON字符串会被转义,导致输出带多余反斜杠; - 用
[]map[string]interface{}或map[string]interface{}只能对应单一结构,无法适配所有响应类型; json.RawMessage既满足通用需求,又保证了输出格式的正确性,是最优解。
内容的提问来源于stack exchange,提问作者Basharat Ali
相关产品推荐
相关产品推荐

