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

Go语言中构造JSON Schema格式返回数据并解决序列化与字段大小写问题

解决Go生成符合前端要求的JSON Schema响应问题

你现在卡在两个关键问题上:返回的data字段是带转义和换行的字符串,还有字段名大写不符合前端的小写要求。我来给你拆解下最直接的解决方案:

核心问题根源

你当前的做法是先把Schema数据序列化成字符串,再把这个字符串塞到响应结构体的data字段里——这就导致最终序列化整个响应时,data会被当成普通字符串处理,自然出现转义字符。正确的思路应该是直接把Schema数据作为响应结构体的嵌套对象,然后整体序列化整个响应。

方案一:用结构体+JSON标签(适合固定结构的Schema)

如果你的JSON Schema结构是固定的,直接定义结构体并添加json:"小写字段名"标签,既能解决大小写问题,又能避免转义:

package main

import (
	"encoding/json"
	"fmt"
)

// 定义统一响应结构体
type Response struct {
	Code    int         `json:"code"`
	Message string      `json:"message"`
	Data    interface{} `json:"data"` // 用interface{}接收任意结构的Schema
}

// 定义Schema相关结构体,每个字段都加json标签指定小写key
type ProductSchema struct {
	Title      string                 `json:"title"`
	Type       string                 `json:"type"`
	Properties map[string]SchemaField `json:"properties"`
}

type SchemaField struct {
	Type       string                 `json:"type,omitempty"`
	Title      string                 `json:"title,omitempty"`
	MinLength  int                    `json:"minLength,omitempty"`
	Properties map[string]SchemaField `json:"properties,omitempty"`
}

func main() {
	// 构建符合要求的Schema数据
	schema := ProductSchema{
		Title: "Product Set",
		Type:  "object",
		Properties: map[string]SchemaField{
			"id":          {Type: "number"},
			"name":        {Type: "string"},
			"price":       {Type: "number"},
			"dimensions": {
				Type: "object",
				Properties: map[string]SchemaField{
					"length":  {Type: "number"},
					"width":   {Type: "number"},
					"height":  {Type: "number"},
				},
			},
			"warehouseLocation": {
				Type: "object",
				Properties: map[string]SchemaField{
					"latitude":  {Type: "number"},
					"longitude": {Type: "number"},
				},
			},
		},
	}

	// 组装响应
	resp := Response{
		Code:    0,
		Message: "",
		Data:    schema, // 直接放入Schema对象,而非序列化后的字符串
	}

	// 序列化整个响应
	jsonData, err := json.MarshalIndent(resp, "", "  ")
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(string(jsonData))
}

运行这段代码,你会得到data是嵌套的JSON对象,没有转义,所有字段都是小写。

方案二:用map[string]interface{}(适合动态生成的Schema)

如果你的Schema是动态生成的(比如从文件解析的testMap),直接用map[string]interface{}会更灵活,不需要定义一堆结构体。只需要确保map的key都是小写,然后直接作为data字段的值:

package main

import (
	"encoding/json"
	"fmt"
)

type Response struct {
	Code    int         `json:"code"`
	Message string      `json:"message"`
	Data    interface{} `json:"data"`
}

func main() {
	// 假设这是你从文件解析得到的testMap,确保所有key都是小写
	testMap := map[string]interface{}{
		"title": "Product Set",
		"type":  "object",
		"properties": map[string]interface{}{
			"id": map[string]interface{}{"type": "number"},
			"name": map[string]interface{}{"type": "string"},
			"price": map[string]interface{}{"type": "number"},
			"dimensions": map[string]interface{}{
				"type": "object",
				"properties": map[string]interface{}{
					"length": {"type": "number"},
					"width": {"type": "number"},
					"height": {"type": "number"},
				},
			},
			"warehouseLocation": map[string]interface{}{
				"type": "object",
				"properties": map[string]interface{}{
					"latitude": {"type": "number"},
					"longitude": {"type": "number"},
				},
			},
		},
	}

	resp := Response{
		Code:    0,
		Message: "",
		Data:    testMap, // 直接放入map,而非序列化后的字符串
	}

	jsonData, err := json.MarshalIndent(resp, "", "  ")
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(string(jsonData))
}

这种方式完全不需要处理结构体的大小写问题,因为map的key你可以直接控制为小写,而且序列化后data就是正常的嵌套JSON对象。

关于你之前动态结构体代码的改进(可选)

如果你一定要用动态结构体生成的方式,需要在创建reflect.StructField的时候设置Tag字段,指定JSON的小写key:

// 修改AddField方法,新增jsonTag参数
func (b *Builder)AddField(field string, typ reflect.Type, jsonTag string) *Builder {
	b.fileId = append(b.fileId, reflect.StructField{
		Name: field,
		Type: typ,
		Tag:  reflect.StructTag(fmt.Sprintf(`json:"%s"`, jsonTag)), // 设置JSON标签
	})
	return b
}

// 调用时指定小写的tag
pe := NewBuilder().
	AddString("Name", "name"). // Go字段名需大写(导出要求),tag是小写的name
	AddInt64("Age", "age").
	AddStruct("Typet", "typet").
	Build()

不过说实话,这种方式比直接用map麻烦很多,除非你有特殊需求,否则更推荐方案二的map方式。

内容的提问来源于stack exchange,提问作者jason-lin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 22:32:41