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

在Go中如何从格式化JSON模板生成精简JSON?

在Go中实现JSON模板可读性与生产环境精简输出的兼顾方案

你可以通过渲染后压缩JSON的方式同时满足两个需求:仓库里的模板保持格式化(方便编辑),渲染后得到无空白的精简JSON用于HTTP请求和日志。以下是两种惯用实现方式:

方案一:用json.Compact直接压缩(推荐)

encoding/json包的Compact函数专门用于移除JSON字符串中的空白字符(换行、缩进、空格等),无需将JSON解析为Go对象,性能更高效,还能顺带校验渲染后的内容是否为合法JSON。

示例代码:

package main

import (
	"bytes"
	"encoding/json"
	"text/template"
)

func main() {
	// 1. 加载并渲染格式化的JSON模板
	tpl, err := template.ParseFiles("templates/simple.template")
	if err != nil {
		panic(err)
	}

	var formattedBuf bytes.Buffer
	// 假设你的模板渲染数据
	renderData := map[string]interface{}{
		"UserID": 123,
		"Email":  "user@example.com",
	}
	if err := tpl.Execute(&formattedBuf, renderData); err != nil {
		panic(err)
	}

	// 2. 压缩JSON为无空白版本
	var compactBuf bytes.Buffer
	if err := json.Compact(&compactBuf, formattedBuf.Bytes()); err != nil {
		panic(err) // 错误说明渲染后的内容不是合法JSON,需检查模板
	}

	// 此时compactBuf.String()就是精简的JSON,可直接用于HTTP请求或日志
	println(compactBuf.String())
}

方案二:解析为Go对象后重新编码

如果需要对渲染后的JSON内容做额外修改(比如动态添加字段、调整结构),可以先将格式化JSON解析为Go数据结构,再用json.Marshal重新编码(Marshal默认输出无空白的JSON):

示例代码:

// 承接上面的formattedBuf
var jsonObj interface{}
if err := json.Unmarshal(formattedBuf.Bytes(), &jsonObj); err != nil {
	panic(err)
}

// 可选:修改jsonObj中的数据
if m, ok := jsonObj.(map[string]interface{}); ok {
	m["Timestamp"] = 1690000000
}

// 重新编码为精简JSON
compactBytes, err := json.Marshal(jsonObj)
if err != nil {
	panic(err)
}
compactStr := string(compactBytes)

注意事项

  • 确保你的JSON模板渲染后输出的是合法的JSON字符串,否则Compact或Unmarshal会返回错误,这也可以帮你提前发现模板的格式问题。
  • 模板文件保持原有的格式化(换行、缩进)即可,无需做任何修改,完全不影响编辑可读性。

内容的提问来源于stack exchange,提问作者Paul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 05:33:39