Golang 直接在模板中使用 json
Golang use json in template directly
我正在寻找一种将 json 数据直接绑定到模板中的方法(在 golang 中没有任何结构表示)- 我正在做空。本质上,我想要的是让模板文档和 json 都只是任意数据——而我的 handleFunc 本质上是:
func handler(writer http.ResponseWriter, request *http.Request) {
t, _ := template.ParseFiles( "someTemplate.html" )
rawJson, _ := ioutil.ReadFile( "someData.json" )
// here's where I need help
somethingTemplateUnderstands := ????( rawJson )
t.Execute( writer, somethingTemplateUnderstands )
}
我已经试过了json.Unmarshal,但它似乎想要一个类型。最主要的是,在实际程序中,json 和模板都来自数据库,并且在运行时是完全可变的,(并且有很多不同的)所以我不能随时编码任何结构程序本身。显然,我希望能够制作如下数据:
{ "something" : { "a" : "whatever" }}
然后是像
这样的模板
<html><body>
the value is {{ .something.a }}
</body></html>
go http.template 库是否可行,或者我需要转到 Node(或寻找另一个模板库?)
您可以使用 json.Unmarshal()
将 JSON 文本解组为 Go 值。
你可以简单地使用 Go 类型 interface{}
来表示任意 JSON 值。通常,如果它是一个结构,则使用 map[string]interface{}
并且如果您也需要在 Go 代码中引用存储在其中的值(但这不能表示例如数组),则更有用。
template.Execute()
and template.ExecuteTemplate()
take the data / parameters of the template as a value of type interface{}
to which you can pass anything in Go. And the template
engine uses reflection (reflect
包)到 "discover" 它的运行时类型,并根据您在模板操作中提供的选择器在其中导航(这可能指定结构的字段或映射中的键,甚至方法名字)。
除此之外,一切都按预期进行。看这个例子:
func main() {
t := template.Must(template.New("").Parse(templ))
m := map[string]interface{}{}
if err := json.Unmarshal([]byte(jsondata), &m); err != nil {
panic(err)
}
if err := t.Execute(os.Stdout, m); err != nil {
panic(err)
}
}
const templ = `<html><body>
Value of a: {{.something.a}}
Something else: {{.somethingElse}}
</body></html>`
const jsondata = `{"something":{"a":"valueofa"}, "somethingElse": [1234, 5678]}`
输出(在 Go Playground 上尝试):
<html><body>
Value of a: valueofa
Something else: [1234 5678]
</body></html>
我正在寻找一种将 json 数据直接绑定到模板中的方法(在 golang 中没有任何结构表示)- 我正在做空。本质上,我想要的是让模板文档和 json 都只是任意数据——而我的 handleFunc 本质上是:
func handler(writer http.ResponseWriter, request *http.Request) {
t, _ := template.ParseFiles( "someTemplate.html" )
rawJson, _ := ioutil.ReadFile( "someData.json" )
// here's where I need help
somethingTemplateUnderstands := ????( rawJson )
t.Execute( writer, somethingTemplateUnderstands )
}
我已经试过了json.Unmarshal,但它似乎想要一个类型。最主要的是,在实际程序中,json 和模板都来自数据库,并且在运行时是完全可变的,(并且有很多不同的)所以我不能随时编码任何结构程序本身。显然,我希望能够制作如下数据:
{ "something" : { "a" : "whatever" }}
然后是像
这样的模板<html><body>
the value is {{ .something.a }}
</body></html>
go http.template 库是否可行,或者我需要转到 Node(或寻找另一个模板库?)
您可以使用 json.Unmarshal()
将 JSON 文本解组为 Go 值。
你可以简单地使用 Go 类型 interface{}
来表示任意 JSON 值。通常,如果它是一个结构,则使用 map[string]interface{}
并且如果您也需要在 Go 代码中引用存储在其中的值(但这不能表示例如数组),则更有用。
template.Execute()
and template.ExecuteTemplate()
take the data / parameters of the template as a value of type interface{}
to which you can pass anything in Go. And the template
engine uses reflection (reflect
包)到 "discover" 它的运行时类型,并根据您在模板操作中提供的选择器在其中导航(这可能指定结构的字段或映射中的键,甚至方法名字)。
除此之外,一切都按预期进行。看这个例子:
func main() {
t := template.Must(template.New("").Parse(templ))
m := map[string]interface{}{}
if err := json.Unmarshal([]byte(jsondata), &m); err != nil {
panic(err)
}
if err := t.Execute(os.Stdout, m); err != nil {
panic(err)
}
}
const templ = `<html><body>
Value of a: {{.something.a}}
Something else: {{.somethingElse}}
</body></html>`
const jsondata = `{"something":{"a":"valueofa"}, "somethingElse": [1234, 5678]}`
输出(在 Go Playground 上尝试):
<html><body>
Value of a: valueofa
Something else: [1234 5678]
</body></html>