
本文详解如何使用 Go 的 encoding/json 包将 struct 转换为标准 JSON 字符串,重点纠正常见标签语法错误(如 json: "key" 中的非法空格),并提供完整可运行示例与最佳实践。
本文详解如何使用 go 的 `encoding/json` 包将 struct 转换为标准 json 字符串,重点纠正常见标签语法错误(如 `json: "key"` 中的非法空格),并提供完整可运行示例与最佳实践。
在 Go 中,直接打印结构体(如 fmt.Println(structVar))输出的是 Go 运行时的默认调试格式(例如 {42 foo}),并非 JSON。要生成符合 RFC 8259 标准的 JSON 字符串,必须显式调用 json.Marshal() 函数。
首先,需修正结构体字段的 JSON 标签语法:Go 要求 json 标签中冒号 : 与引号之间不能有空格。错误写法 json: "id" 会导致标签被忽略,字段名(Id、Name)将以首字母大写形式出现在 JSON 中;正确写法为 json:"id",且推荐使用小写键名以符合 REST API 通用规范。
以下是完整、可运行的修复后代码:
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
package main
import (
"encoding/json"
"fmt"
)
func main() {
type CommentResp struct {
Id string `json:"id"` // ✅ 正确:无空格,小写键名
Name string `json:"name"` // ✅ 正确
}
data := CommentResp{
Id: "42",
Name: "Foo",
}
// 使用 json.Marshal 将结构体编码为 JSON 字节切片
jsonData, err := json.Marshal(data)
if err != nil {
panic(fmt.Sprintf("JSON marshaling failed: %v", err))
}
// 将字节切片转为字符串并打印
fmt.Println(string(jsonData)) // 输出:{"id":"42","name":"Foo"}
}
⚠️ 注意事项:
json.Marshal()返回([]byte, error),务必检查错误——常见错误包括字段不可导出(首字母小写)、包含不支持类型(如函数、channel)或循环引用。- 若需美化输出(带缩进),可使用
json.MarshalIndent(data, "", " ")。- 对于 Web 开发,常配合
http.ResponseWriter直接写入 JSON 响应:json.NewEncoder(w).Encode(data),它自动处理错误和 Content-Type 设置。
总结:Go 结构体转 JSON 的核心是 正确的 struct tag + json.Marshal 调用。忽略标签语法细节或跳过错误处理,是初学者最常见的两个坑。养成始终验证标签格式、显式处理 err 的习惯,即可稳定生成合规 JSON。










