Go语言中如何通过字符串插值动态构建JSON数据包?
在Go中动态生成JSON的正确方式
你直接在字符串字面量里用{{ NAME }}这种模板语法的写法在Go里是跑不通的,Go原生字符串不支持这种插值,这么写会直接报语法错误。下面给两种靠谱的实现方式:
方法一:使用text/template模板包
Go标准库的text/template可以实现字符串模板插值,适合需要自定义JSON结构模板的场景:
package main import ( "bytes" "text/template" ) func main() { name := "John Doe" occupation := "gardener" // 定义JSON模板,注意变量要用{{ .Name }}这种格式 jsonTemplate := `{ "Id": 1, "Name": "{{ .Name }}", "Occupation": "{{ .Occupation }}" }` // 创建模板并解析 tpl, err := template.New("json").Parse(jsonTemplate) if err != nil { panic(err) } // 准备模板数据 data := struct { Name string Occupation string }{ Name: name, Occupation: occupation, } // 执行模板,输出到缓冲区 var buf bytes.Buffer err = tpl.Execute(&buf, data) if err != nil { panic(err) } // 转成[]byte,就是最终的JSON数据 jsonData := buf.Bytes() }
方法二:使用encoding/json序列化结构体(推荐)
这种方式更安全,能自动处理JSON语法转义,避免手动拼接可能出现的错误,是Go生成JSON的常规做法:
package main import ( "encoding/json" ) func main() { // 定义对应JSON结构的结构体,字段标签指定JSON键名 type Person struct { Id int `json:"Id"` Name string `json:"Name"` Occupation string `json:"Occupation"` } // 实例化结构体,填充动态数据 person := Person{ Id: 1, Name: "John Doe", Occupation: "gardener", } // 序列化成JSON字节数组 jsonData, err := json.MarshalIndent(person, "", " ") if err != nil { panic(err) } }
json.MarshalIndent会生成带缩进的格式化JSON,如果不需要格式化,用json.Marshal即可。
内容的提问来源于stack exchange,提问作者Micheal J. Roberts
相关产品推荐
相关产品推荐

