Go语言Gin-Gonic框架使用c.JSON返回合法嵌套JSON数据问题
问题原因
c.JSON()方法的核心能力是自动将传入的Go变量序列化为标准JSON格式。你直接传入JSON格式字符串时,Gin会将该字符串判定为普通字符串类型值,会自动给字符串外层加双引号、转义内部的换行符和双引号,最终返回的就是你看到的不符合预期的结果。
解决方案1:直接解析已有的JSON字符串后返回
如果你的JSON结构是固定写死的、不想额外定义结构体,可以先把写好的JSON字符串反序列化为Go的切片/映射类型,再传给c.JSON()即可:
import "encoding/json" r.GET("/api/auth", func(c *gin.Context) { // 注意:原JSON字符串最后一个字段末尾的多余逗号需要删除,否则反序列化会报错 jsonStr := `[{ "date": "gAAAAABgupdG-1IDgOD1uqauANLdt4KC8yHazbPt5g==", "hwid": "GyFfDNpk56WcKOCAgKqIr8ELI0nAhe2ZgjEdLr5UHblBXeS-5pl2YIunZHwrbQoZv6gtD-ORLAwSQu7futgRTZUr5sNXnkjGurT60EJGRHn_S", "hwid_resets": "TljjFnU_QkmYgQw9bfqHlFXSw1uQPsznwSylQ8_awHoxOKoYaCEFPg==", "id": "gAAAAABgupdGg6POUjVAUMazxKmsIB2D-gu5zRZWK2eaqJk-OMohG-JQL00hAD2SpEB-mnJYJChBGPQ==", "key": "gAAAAABgupdGq_HbYNJWkl7btrZUrxdO3wlwS8_KWUh69EXwxmTiSsB_GynUVcxpbOOKSQmfR_FoRmgfwz6-LI3yp7D-VIY-X6B7DSl0nAK2s", "notes": "gAAAAABgupdGSSMNcQXVFzyIbT8mdRan204BDkNLH-jCaVMMMQxbGBx0jej3_2hjSFpagBa5BNU1WqsIR1og-A==", "total_logins": "gAAAAABgupdGEF_9XEIbHefOuNuvxypTh9orUKS0qC8Kbvql7xJw1wn8aT0wVGsFxVllJBFw==" }]` var jsonData []any err := json.Unmarshal([]byte(jsonStr), &jsonData) if err != nil { c.JSON(500, gin.H{"error": "数据解析失败"}) return } c.JSON(200, jsonData) })
解决方案2:定义结构体(生产环境推荐写法)
更推荐定义和JSON字段匹配的结构体,直接传递结构体实例给c.JSON(),代码可读性、可维护性更高,还能利用Go的类型校验能力避免字段错误:
// 定义和JSON字段对应的结构体 type AuthItem struct { Date string `json:"date"` Hwid string `json:"hwid"` HwidResets string `json:"hwid_resets"` Id string `json:"id"` Key string `json:"key"` Notes string `json:"notes"` TotalLogins string `json:"total_logins"` } r.GET("/api/auth", func(c *gin.Context) { jsonData := []AuthItem{ { Date: "gAAAAABgupdG-1IDgOD1uqauANLdt4KC8yHazbPt5g==", Hwid: "GyFfDNpk56WcKOCAgKqIr8ELI0nAhe2ZgjEdLr5UHblBXeS-5pl2YIunZHwrbQoZv6gtD-ORLAwSQu7futgRTZUr5sNXnkjGurT60EJGRHn_S", HwidResets: "TljjFnU_QkmYgQw9bfqHlFXSw1uQPsznwSylQ8_awHoxOKoYaCEFPg==", Id: "gAAAAABgupdGg6POUjVAUMazxKmsIB2D-gu5zRZWK2eaqJk-OMohG-JQL00hAD2SpEB-mnJYJChBGPQ==", Key: "gAAAAABgupdGq_HbYNJWkl7btrZUrxdO3wlwS8_KWUh69EXwxmTiSsB_GynUVcxpbOOKSQmfR_FoRmgfwz6-LI3yp7D-VIY-X6B7DSl0nAK2s", Notes: "gAAAAABgupdGSSMNcQXVFzyIbT8mdRan204BDkNLH-jCaVMMMQxbGBx0jej3_2hjSFpagBa5BNU1WqsIR1og-A==", TotalLogins: "gAAAAABgupdGEF_9XEIbHefOuNuvxypTh9orUKS0qC8Kbvql7xJw1wn8aT0wVGsFxVllJBFw==", }, } c.JSON(200, jsonData) })
内容的提问来源于stack exchange,提问作者Parallax
相关产品推荐
相关产品推荐

