在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
相关产品推荐
相关产品推荐

