如何发送一组地图并使用gin-templating迭代它

时间:2016-08-23 08:40:49

标签: json go unmarshalling go-templates go-gin

以下是工作代码的片段。我正在使用杜松子酒模板引擎。

c.HTML(200, "index", gin.H{
            "title":    "Welcome",
            "students": map[int]map[string]string{1: {"PID": "1", "Name": "myName"}},})

在索引模板中我有:

 <TABLE class= "myTable" >
        <tr class="headingTr">
            <td>Name</td>
        </tr>
        {{range $student := .students}}
        <td>{{$student.Name}}</td>                    
        {{end}}
 </TABLE>

正如您所看到的,我在标题(地图)上对students的值进行了硬编码。我希望从我构建的其他API获取此数据。我的rest API的响应是一个数组:

 [
  {
    "id": 1,
    "name": "Mary"
  },
  {
    "id": 2,
    "name": "John"
  }
]

我可以将此JSON响应解组为map[string]string而不是map[int]map[string]string。如何在学生的参数值中传递这个未经传输的正文,然后在这个数组上迭代索引模板?

1 个答案:

答案 0 :(得分:1)

使用结构

你拥有的是一个JSON数组,将其解组为Go切片。建议创建一个Student结构,以便为学生建立一个干净且有意识的Go代码。

在模板中,{{range}}操作将点.设置为当前元素,您可以在{{range}}正文中将其简称为点.,所以学生姓名为.Name

工作代码(在Go Playground上尝试):

func main() {
    t := template.Must(template.New("").Parse(templ))
    var students []Student
    if err := json.Unmarshal([]byte(jsondata), &students); err != nil {
        panic(err)
    }
    params := map[string]interface{}{"Students": students}
    if err := t.Execute(os.Stdout, params); err != nil {
        panic(nil)
    }
}

const jsondata = `[
  {
    "id": 1,
    "name": "Mary"
  },
  {
    "id": 2,
    "name": "John"
  }
]`

const templ = `<TABLE class= "myTable" >
        <tr class="headingTr">
            <td>Name</td>
        </tr>
        {{range .Students}}
        <td>{{.Name}}</td>                    
        {{end}}
 </TABLE>`

输出:

<TABLE class= "myTable" >
        <tr class="headingTr">
            <td>Name</td>
        </tr>

        <td>Mary</td>                    

        <td>John</td>                    

 </TABLE>

带地图

如果您不想创建和使用Student结构,您仍然可以使用类型为map[string]interface{}的简单映射来执行此操作,该映射可以表示任何JSON对象,但在此处知道例如,您必须将学生的姓名称为.name,因为它在JSON文本中的显示方式如此,因此在解组的Go地图中将使用小写的"name"密钥:

func main() {
    t := template.Must(template.New("").Parse(templ))
    var students []map[string]interface{}
    if err := json.Unmarshal([]byte(jsondata), &students); err != nil {
        panic(err)
    }
    params := map[string]interface{}{"Students": students}
    if err := t.Execute(os.Stdout, params); err != nil {
        panic(nil)
    }
}

const templ = `<TABLE class= "myTable" >
        <tr class="headingTr">
            <td>Name</td>
        </tr>
        {{range .Students}}
        <td>{{.name}}</td>                    
        {{end}}
 </TABLE>`

输出是一样的。请在Go Playground上尝试此变体。