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

Go语言通用API响应包装求助:适配多种JSON响应格式

通用JSON响应包装方案(适配任意JSON格式)

你可以用json.RawMessage来实现通用包装,它能直接保留API返回的原始JSON字节,不需要提前解析成特定结构,完美适配数组、对象、嵌套JSON等任意格式。

解决步骤:

  1. 定义带JSON标签的通用结构体
    注意给字段加上json标签,确保输出的键是小写的data和statusCode,和你要求的格式完全匹配:

    import "encoding/json"
    
    type CommonResponse struct {
        Data       json.RawMessage `json:"data"`
        StatusCode int             `json:"statusCode"`
    }
    
  2. 直接复用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.RawMessage本质是[]byte的别名,序列化时会直接输出原始JSON字节,不会像字符串那样被二次转义;
  • 不需要提前判断响应是数组还是对象,省去分支处理的麻烦,完全通用;
  • 保留了API响应的原始结构,不会出现解析丢失或格式变形的问题。

对比你之前的问题:

  • 用Model[string]时,JSON字符串会被转义,导致输出带多余反斜杠;
  • 用[]map[string]interface{}或map[string]interface{}只能对应单一结构,无法适配所有响应类型;
  • json.RawMessage既满足通用需求,又保证了输出格式的正确性,是最优解。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 01:24:29