Golang直接在模板中使用json

时间:2016-07-18 12:35:08

标签: json templates go

我正在寻找一种将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和模板都来自数据库,并且在运行时完全可以更改(并且有很多不同的),因此我无法对go程序本身中的任何结构进行编码。显然,我希望能够制作如下数据:

{ "something" : { "a" : "whatever" }}

然后是

之类的模板
<html><body>
    the value is {{ .something.a }}
</body></html>

这可以通过go http.template库实现,还是需要转到Node(或找到另一个模板库?)

1 个答案:

答案 0 :(得分:8)

您可以使用json.Unmarshal()将JSON文本解组为Go值。

您只需使用Go类型interface{}来表示任意JSON值。通常,如果它是一个结构体,则使用map[string]interface{},如果您需要在Go代码中引用存储在其中的值,则更有用(例如,这不能表示数组)。

template.Execute()template.ExecuteTemplate()将模板的数据/参数作为interface{}类型的值,您可以在Go中传递任何内容。 template引擎使用反射(reflect包)来发现&#34;发现&#34;它的运行时类型,并根据您在模板操作中提供的选择器(可以在地图中指定结构或键的字段,甚至是方法名称)在其中导航。

除此之外,一切都按预期工作。见这个例子:

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>