json - 如何使用 html 模板解组结构?
问题描述
我正在尝试将 JSON 解组到我的 Mail 结构,但 Go 在解析 html_tmpl 和 text_tmpl 字段时返回错误。我怎么解决这个问题?
HtmlTmpl 字段来自:
html, err := template.ParseFiles(pathToHTMLFile)
这是您可以测试的基本示例
package main
import (
"encoding/json"
"fmt"
"html/template"
"time"
)
type Mail struct {
Id string `json:"id"`
Subject string `json:"subject"`
From string `json:"from"`
To string `json:"to"`
Date time.Time `json:"date"`
HtmlTmpl template.Template `json:"html_tmpl"`
TextTmpl template.Template `json:"text_tmpl"`
Context map[string]string `json:"context"`
}
func main() {
mail := &Mail{}
s := `{"id":"","subject":"Test mail","from":"support@example.com","to":"user@gmail.com","date":"0001-01-01T00:00:00Z","html_tmpl":{"Tree":{"Name":"template.html","ParseName":"template.html","Root":{"NodeType":11,"Pos":0,"Nodes":[{"NodeType":0,"Pos":0,"Text":"PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9InJ1Ij4KPGhlYWQ+Cgk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbCIgY2hhcnNldD0iVVRGLTgiPgoJPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbD0xIj4KCTxtZXRhIGh0dHAtZXF1aXY9IlgtVUEtQ29tcGF0aWJsZSIgY29udGVudD0iSUU9ZWRnZSI+Cgk8dGl0bGU+0J/RgNC+0LLQtdGA0LrQsCDRgdCy0Y/Qt9C4PC90aXRsZT4KPC9oZWFkPgo8Ym9keT4KCTxzcGFuPg=="},{"NodeType":1,"Pos":298,"Line":10,"Pipe":{"NodeType":14,"Pos":298,"Line":10,"IsAssign":false,"Decl":null,"Cmds":[{"NodeType":4,"Pos":298,"Args":[{"NodeType":8,"Pos":298,"Ident":["msg"]}]}]}},{"NodeType":0,"Pos":305,"Text":"PC9zcGFuPgo8L2JvZHk+CjwvaHRtbD4="}]}}},"text_tmpl":{"Tree":{"Name":"template.txt","ParseName":"template.txt","Root":{"NodeType":11,"Pos":0,"Nodes":[{"NodeType":1,"Pos":2,"Line":1,"Pipe":{"NodeType":14,"Pos":2,"Line":1,"IsAssign":false,"Decl":null,"Cmds":[{"NodeType":4,"Pos":2,"Args":[{"NodeType":8,"Pos":2,"Ident":["msg"]}]}]}}]}}},"context":{"msg":"Hi!"}}`
err := json.Unmarshal([]byte(s), mail)
fmt.Println(err)
fmt.Println(mail)
}
解决方案
template.Template
不支持从 JSON 编组/解组。它是一个带有未导出字段的结构,并且它没有实现处理封送/解封逻辑的接口(例如json.Unmarshaler
)。
您应该做的是在您的 JSON 和结构中包含源模板文本,并在解组源模板文本后,将其解析为后处理步骤。如果你想编组一个包含模板的结构,它应该只包含源模板文本(template.Template
字段应该被标记为省略,如json:"-"
)。
推荐阅读
- html - 在特定文本旁边居中的短水平线的 HTML 代码
- python-unittest - 如何在python3中模拟来自另一个模块的变量?
- python - 在多进程模式下将 Sanic 与 Prometheus 一起使用:FileNotFoundError
- python - 避免每次迭代都覆盖字典
- hashcode - 为动态字段生成哈希码(LINQ 可以识别)
- python - 如何从 Google Cloud Function 的代码中更改环境变量的值?
- java - GC 可以收集当前在同步块中用作监视器的对象吗?
- spring-boot - 将来自 Spring Cloud Sleuth 的 TraceId 添加到 API Gateway 过滤器
- parsing - 解析表达式 - 一元、二元和递增/递减运算符
- excel - 使用复制创建价目表,使用 VBA 粘贴