本文介绍如何在 go 程序中将结构体(含字段名、值及原始类型,如数组、布尔值、嵌套结构等)准确序列化为标准 json 字符串,并直接输出到终端或管道,适用于 cli 工具、与 rails 等外部系统集成等场景。
在 Go 中,将结构体转换为符合 RFC 8259 规范的 JSON 字符串并输出,不应依赖 fmt.Printf 或 fmt.Println 的默认格式化(如 %+v)——它们输出的是 Go 语法风格的调试表示,不含双引号、无转义、不区分字符串与数字类型,且无法处理嵌套、切片、指针等复杂结构。
正确的方式是使用标准库 encoding/json 包提供的 json.Encoder(推荐用于流式输出,如 os.Stdout)或 json.Marshal(适用于需进一步处理 JSON 字节流的场景)。
该方法安全、高效、自动处理类型映射(string → "string",int → 123,[]string → ["a","b"],nil → null),并确保输出合法 JSON(含换行符,符合 JSON 文本规范):
package main
import (
"encoding/json"
"log"
"os"
)
func main() {
// 示例结构体(支持导出字段、嵌套、切片、布尔值等)
data := struct {
Name string `json:"name"`
Age int `json:"age"`
Tags []string `json:"tags"`
Active bool `json:"active"`
Metadata map[string]interface{} `json:"metadata"`
}{
Name: "Alice",
Age: 30,
Tags: []string{"golang", "json", "cli"},
Active: true,
Metadata: map[string]interface{}{
"version": 1.2,
"legacy": false,
},
}
// 输出为标准 JSON 到 stdout(自动换行,符合 JSON Text 规范)
if err := json.NewEncoder(os.Stdout).Encode(data); err != nil {
log.Fatal("JSON encoding failed:", err)
}
}运行后输出:
{"name":"Alice","age":
30,"tags":["golang","json","cli"],"active":true,"metadata":{"version":1.2,"legacy":false}}? 注意:字段必须首字母大写(即导出字段),否则 json 包无法访问;可通过 json:"key_name" 标签自定义键名,支持 ,omitempty 省略空值。
bytes, err := json.Marshal(data)
if err != nil {
log.Fatal(err)
}
fmt.Print(string(bytes)) // 注意:Marshal 不自动换行总之,encoding/json 是 Go 生态中稳定、标准、零依赖的 JSON 解决方案。只要结构体设计合理、字段导出且标签得当,即可一键生成可互操作的 JSON 输出,完美满足 CLI 集成、API 原型或跨语言数据交换需求。