我的JSON结构不足。
func getJsonMappings() *string {
data := `{
"CategoryGroup": {
"Category subgrp1": ["type1", "type2"],
},
"CategoryGroupDetail" : {
"type1":{
"extension":"abc",
"title" : "this is description",
"other": "i have some other details apart from above in this map"
},
"type2" :{
"extension":"abc",
"title" : "this is description",
"other": "i have some other details apart from above in this map"
}
}
}`
return &data
}
我在JSON之上解组以控制器函数定义
中的golang数据结构如下所示func (this *MainPageController) Get() {
jsonData := getJsonMappings()
var catMapObj map[string]interface{}
err := json.Unmarshal([]byte(*jsonData), &catMapObj)
if err != nil {
panic(err.Error())
}
this.Data["CategoryGroup"] = catMapObj["CategoryGroup"]
this.Data["CatAttributeMapping"] = catMapObj["CatAttributeMapping"]
this.TplName = "index.tpl"
}
并尝试在模板下面渲染。
<ul class="collapsible collapsible-accordion">
{{ range $eachCategory, $subCategoriesList := .CategoryGroup }}
<li class="bold"><a class="collapsible-header waves-effect waves-teal">{{ $eachCategory }}</a>
<div class="collapsible-body" style="">
<ul>
{{ range $_, $subConvertorCategoryId := $subCategoriesList }}
<li><a id="{{ $subConvertorCategoryId }}" class='doc_cvt' href="#">{{ $subConvertorCategoryId|getCategoryTitle }}</a></li>
{{ end }}
</ul>
</div>
</li>
{{ end }}
</ul>
其中getCategoryTitle是模板函数。但我没有得到类型变量的任何值作为函数参数。我的模板函数定义类似于
func GetCategoryTitle(type string) (title string) {
.....
}
如果我在函数内部将“type”的值硬编码为“type1”,那么一切看起来都不错。但我想在运行时从模板发送值。在同一时刻,我能够将“.CategoryGroup”的值传递给模板函数。
因此我的问题是:
1-如何将解析模板时收到的地图的键或值传递给golang模板函数?
2-如果您仔细查看上面的结构,那么您将发现我不需要编写模板函数。我应该得到像这样的价值 {{.CategoryGroupDetail。$ subConvertorCategoryId.title}}。但我无法这样做。我对django(python框架)做了同样的事情。必须有办法在golang / beego中也这样做。
我是golang和Beego的新手。请指导我如何进一步。
Try1:
<ul class="collapsible collapsible-accordion">
{{ range $eachCategory, $subCategoriesList := .CategoryGroup }}
<li class="bold"><a class="collapsible-header waves-effect waves-teal">{{ $eachCategory }}</a>
<div class="collapsible-body" style="">
<ul>
{{ range $_, $subConvertorCategoryId := $subCategoriesList }}
{{ $categoryDetail := index .CatAttributeMapping $subConvertorCategoryId}}
<li><a id="{{ $subConvertorCategoryId }}" class='doc_cvt' href="#">{{ $categoryDetail.title }}</a></li>
{{ end }}
</ul>
</div>
</li>
{{ end }}
我在运行时遇到错误 -
template: index.tpl:38:32: executing "index.tpl" at <.CatAttributeMapping>: can't evaluate field CatAttributeMapping in type interface {}
答案 0 :(得分:0)
看起来您正在尝试使用点运算符访问地图的内部。不知道最终结果应该是什么样的,这会让事情变得更加困难。
我认为这个例子可以帮助您找到两个问题:
{{ range $eachCategory, $subCategoriesList := .CategoryGroup }}
<li class="bold"><a class="collapsible-header waves-effect waves-teal">{{ $eachCategory }}</a>
<div class="collapsible-body" style="">
<ul>
{{ range $key, $val := index .CatAttributeMapping $eachCategory }}
<li><a id="{{ $key}}" class='doc_cvt' href="#">{{ $val.title }}</a></li>
{{ end }}
</ul>
</div>
</li>
{{ end }}
有关索引命令的更多详细信息,请查看:http://golang.org/pkg/text/template/
关键部分是
index返回索引其第一个参数的结果 以下论点。因此,在Go语法中,“index x 1 2 3”是 X 1 [2] [3]。每个索引项必须是地图,切片或数组。
Beego在大多数情况下只使用golang基本模板系统。
编辑1:你问一个复合问题,所以事情变得有点棘手。要弄清楚的第一件事是你是否正确地将数据解析为结构。如果你没有这样做,将把它传递给一个界面,让你弄清楚如何处理。从你的代码看起来你正在处理这种情况。
所以一次只考虑一个问题。 this is a great Q&A that covers parsing nested structures in go
如果您仍然遇到问题,我建议您使用不同的标签重新提交您的问题。在验证结构已正确设置后,将一个提交给golang json尝试使解析正确,并提交一个golang模板。
首先将数据放入结构中,然后使其与模板一起使用。对不起,我没有适合你的复制粘贴解决方案,但我现在有点忙。
我会尽我所能回到这个问题,因为我不认为你是孤身一人。使用JSON解析器处理嵌套结构并处理模板引擎可能很困难。我们需要创建更多如何做事的例子!