我有一个非常通用的应用程序。
客户端通过发送json编码的消息与之交谈,消息可能包含应用程序无需知道的任何数量的字段。
该应用加载配置文件并包含一些模板字段。
例如:
template = "Value read from json: {{.FilePath}}"
和
json from client = { "FilePath": "/tmp/filename.abc", "OtherField1":"value1" }
等
当使用普通的golang模板时,首先需要定义一个结构,以便将json解组为。 然后使用来自结构的值创建和执行模板。
这是一个问题,我不想一起硬编码一个结构,它将FilePath作为字符串包含在用户可能认为有用的任何其他字段中。它使它不通用。
我如何解决这个问题?或者是否有另一种方法可以在不使用golang模板的情况下组合json和模板?
答案 0 :(得分:5)
将JSON解组为TypeError: 'NoneType' object is not callable
值并将该值传递给模板interface{}
方法。问题中的模板与问题中的JSON一样工作。
Execute
答案 1 :(得分:0)
可能是你可以将json解组到地图中,然后以这种方式访问数据: {{ index "FilePath" MyMapVar }}
我认为index
函数的工作方式与切片相同。
问候。
以下是我所说的一个例子:
package main
import (
"encoding/json"
"fmt"
"html/template"
"net/http"
)
func main() {
jsonData := make(map[string]interface{})
body := []byte(`{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
}`)
json.Unmarshal(body, &jsonData)
mTemplate := `<p>UserID: {{ index . "userId" }}</p>
<p>ID: {{ index . "id" }}</p>
<p>Title: {{ index . "title" }}</p>
<p>Body: {{ index . "body" }}</p>`
http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
templ := template.New("CompiledTemplate")
templ = template.Must(templ.Parse(mTemplate))
templ.Execute(w, jsonData)
})
// Iniciamos el servidor, y retornamos el presunto error que pueda dar.
fmt.Printf("\nEscuchando en el puerto %d\n", 9090)
http.ListenAndServe(":"+fmt.Sprint(9090), nil)
}
这与Cerise Limón给出的解决方案非常相似。
我的第一个答案也错了,访问模板中切片/地图位置的方式不是这样的: ,如下所示:{{1} } {{ index "FilePath" MyMapVar }}