如何在Go中美观地输出JSON:完整指南及示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

为什么Go中的JSON看起来像一团乱麻以及如何解决?

\n

你是否曾经用Go编写过一个输出JSON的程序,然后在终端中得到了类似这样的结果?

\n
{"name":"PythonLib","year":2025,"tags":["go","json","tutorial"],"active":true}
\n

说实话,没有特殊工具来阅读这个可不太愉快。尤其是当数据结构复杂,嵌套层级很深的时候。眼睛会开始发花,找到需要的字段变成了一项真正的挑战。

\n

好消息是:Go有内置的工具,可以将这团“乱麻”变成一个整洁、结构化的文档。今天我们将讨论所有美观点格式化JSON的方法——从简单使用标准库到创建你自己的美观点打印工具。

\n

本文基于Stack Overflow上的一个真实问题(超过50,000次浏览),所以这个话题确实很受欢迎。我们开始吧!

\n\n

什么是美观点打印以及为什么需要它?

\n

美观点打印(或“美观打印”)是一种数据格式化方式,通过缩进、换行和对齐,使数据便于人类阅读。在JSON的上下文中,这意味着:

\n
    \n
  • 为嵌套元素添加空格或制表符
  • \n
  • 将每个“键-值”对换行显示
  • \n
  • 对齐值以提高可读性
  • \n
\n

为什么在Go中需要它?想象一下你在调试API响应、编写日志记录器或只是输出配置。未格式化的JSON占用空间更少,但完全不可读。美观点打印只需几行代码就能解决这个问题。

\n\n

方法1:json.MarshalIndent — 标准解决方案

\n

最简单且推荐的方法是使用标准包encoding/json中的json.MarshalIndent函数。它正好做你需要的事情:接收数据并返回带有缩进的格式化JSON。

\n

这是一个基本示例:

\n
package main\n\nimport (\n    "encoding/json"\n    "fmt"\n    "log"\n)\n\ntype Site struct {\n    Name   string   `json:"name"`\n    Year   int      `json:"year"`\n    Tags   []string `json:"tags"`\n    Active bool     `json:"active"`\n}\n\nfunc main() {\n    site := Site{\n        Name:   "PythonLib",\n        Year:   2025,\n        Tags:   []string{"go", "json", "tutorial"},\n        Active: true,\n    }\n\n    // 前缀 — "",缩进 — "  "(两个空格)\n    prettyJSON, err := json.MarshalIndent(site, "", "  ")\n    if err != nil {\n        log.Fatalf("编组错误: %v", err)\n    }\n\n    fmt.Println(string(prettyJSON))\n}
\n

结果:

\n
{\n  "name": "PythonLib",\n  "year": 2025,\n  "tags": [\n    "go",\n    "json",\n    "tutorial"\n  ],\n  "active": true\n}
\n

很美观,对吧?请注意MarshalIndent的第二和第三个参数:

\n
    \n
  • 前缀 — 添加到每行开头的字符串。通常是空字符串""。
  • \n
  • 缩进 — 每个嵌套级别的字符串。最常用的是两个空格" "或制表符"\\t"。
  • \n
\n\n

缩进设置:空格 vs 制表符

\n

你可以轻松更改缩进样式。例如,使用制表符:

\n
prettyJSON, _ := json.MarshalIndent(site, "", "\\t")\nfmt.Println(string(prettyJSON))
\n

结果:

\n
{\n\t"name": "PythonLib",\n\t"year": 2025,\n\t"tags": [\n\t\t"go",\n\t\t"json",\n\t\t"tutorial"\n\t],\n\t"active": true\n}
\n

选择哪个版本?如果你的项目遵循Go标准(它们推荐代码使用制表符),请使用"\\t"。如果你在团队中工作,团队习惯使用空格——两个空格会更合适。最重要的是保持一致性。

\n\n

方法2:对原始JSON字符串进行美观点打印

\n

如果你已经有一个未格式化的JSON字符串怎么办?

博客

书籍推荐