执行模板时没有已知格式的结构

时间:2018-01-11 22:40:13

标签: json templates go

我有一个非常通用的应用程序。

客户端通过发送json编码的消息与之交谈,消息可能包含应用程序无需知道的任何数量的字段。

该应用加载配置文件并包含一些模板字段。

例如:

template = "Value read from json: {{.FilePath}}"

json from client = { "FilePath": "/tmp/filename.abc", "OtherField1":"value1" }

当使用普通的golang模板时,首先需要定义一个结构,以便将json解组为。 然后使用来自结构的值创建和执行模板。

这是一个问题,我不想一起硬编码一个结构,它将FilePath作为字符串包含在用户可能认为有用的任何其他字段中。它使它不通用。

我如何解决这个问题?或者是否有另一种方法可以在不使用golang模板的情况下组合json和模板?

2 个答案:

答案 0 :(得分:5)

将JSON解组为TypeError: 'NoneType' object is not callable 值并将该值传递给模板interface{}方法。问题中的模板与问题中的JSON一样工作。

Execute

Run the code on the Playground

答案 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给出的解决方案非常相似。

我的第一个答案也错了,访问模板中切片/地图位置的方式不是这样的: {{ index "FilePath" MyMapVar }} ,如下所示:{{1} }