Golang中如何设置和使用JSON输入文件中的动态变量如{{START_DATE}}
Golang中如何设置和使用JSON输入文件中的动态变量如{{START_DATE}} 大家好,
我遇到一个任务,需要将 JSON 键值对设置为全局参数,并将它们作为输入传递给另一个 JSON 文件,并动态确定其值,类似于以下示例:
{
"Time":
"gte": "{{START_DATE}}"
"lte": "{{END_DATE}}"
}
如何在输入 JSON 文件中传递动态全局参数。
1 回复
更多关于Golang中如何设置和使用JSON输入文件中的动态变量如{{START_DATE}}的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Golang中处理JSON文件中的动态变量(如{{START_DATE}}),可以通过模板解析和变量替换来实现。以下是具体实现方案:
1. 定义全局参数结构体
type GlobalParams struct {
StartDate string `json:"START_DATE"`
EndDate string `json:"END_DATE"`
// 添加其他动态参数
}
// 初始化全局参数
var globalParams = GlobalParams{
StartDate: "2024-01-01",
EndDate: "2024-12-31",
}
2. 使用模板引擎替换动态变量
import (
"bytes"
"encoding/json"
"fmt"
"strings"
"text/template"
)
func ReplaceDynamicVars(jsonStr string, params GlobalParams) (string, error) {
// 创建模板
tmpl, err := template.New("jsonTemplate").Parse(jsonStr)
if err != nil {
return "", fmt.Errorf("模板解析失败: %v", err)
}
// 执行模板替换
var buf bytes.Buffer
err = tmpl.Execute(&buf, params)
if err != nil {
return "", fmt.Errorf("模板执行失败: %v", err)
}
return buf.String(), nil
}
3. 完整示例代码
package main
import (
"bytes"
"encoding/json"
"fmt"
"log"
"text/template"
)
type GlobalParams struct {
StartDate string `json:"START_DATE"`
EndDate string `json:"END_DATE"`
UserName string `json:"USER_NAME"`
}
type TimeRange struct {
GTE string `json:"gte"`
LTE string `json:"lte"`
}
type Config struct {
Time TimeRange `json:"Time"`
}
func main() {
// 定义全局参数
params := GlobalParams{
StartDate: "2024-01-01T00:00:00Z",
EndDate: "2024-12-31T23:59:59Z",
UserName: "john_doe",
}
// JSON模板字符串(包含动态变量)
jsonTemplate := `{
"Time": {
"gte": "{{.StartDate}}",
"lte": "{{.EndDate}}"
},
"User": "{{.UserName}}"
}`
// 替换动态变量
result, err := replaceTemplateVars(jsonTemplate, params)
if err != nil {
log.Fatal(err)
}
// 解析为结构体
var config Config
err = json.Unmarshal([]byte(result), &config)
if err != nil {
log.Fatal(err)
}
fmt.Printf("处理后的JSON: %s\n", result)
fmt.Printf("开始时间: %s\n", config.Time.GTE)
fmt.Printf("结束时间: %s\n", config.Time.LTE)
}
func replaceTemplateVars(templateStr string, params GlobalParams) (string, error) {
tmpl, err := template.New("config").Parse(templateStr)
if err != nil {
return "", err
}
var buf bytes.Buffer
err = tmpl.Execute(&buf, params)
if err != nil {
return "", err
}
return buf.String(), nil
}
4. 从文件读取并处理
func ProcessJSONFile(templateFile string, params GlobalParams) ([]byte, error) {
// 读取模板文件
content, err := os.ReadFile(templateFile)
if err != nil {
return nil, err
}
// 替换变量
result, err := replaceTemplateVars(string(content), params)
if err != nil {
return nil, err
}
// 验证JSON格式
var js map[string]interface{}
if err := json.Unmarshal([]byte(result), &js); err != nil {
return nil, fmt.Errorf("无效的JSON: %v", err)
}
return []byte(result), nil
}
5. 使用自定义分隔符(如果需要{{}}格式)
func ReplaceWithCustomDelimiters(jsonStr string, params map[string]string) string {
result := jsonStr
for key, value := range params {
placeholder := "{{" + key + "}}"
result = strings.ReplaceAll(result, placeholder, value)
}
return result
}
// 使用示例
paramsMap := map[string]string{
"START_DATE": "2024-01-01",
"END_DATE": "2024-12-31",
}
jsonInput := `{"Time": {"gte": "{{START_DATE}}", "lte": "{{END_DATE}}"}}`
finalJSON := ReplaceWithCustomDelimiters(jsonInput, paramsMap)
6. 支持嵌套结构的完整示例
type QueryParams struct {
TimeRange struct {
Start string `json:"start"`
End string `json:"end"`
} `json:"time_range"`
Filters map[string]interface{} `json:"filters"`
}
func GenerateDynamicJSON(params GlobalParams) ([]byte, error) {
// 构建包含动态变量的数据结构
query := map[string]interface{}{
"time_range": map[string]string{
"start": params.StartDate,
"end": params.EndDate,
},
"filters": map[string]interface{}{
"status": "active",
"user": params.UserName,
"timestamp": fmt.Sprintf("{{.StartDate}} to {{.EndDate}}"),
},
}
// 转换为JSON
jsonData, err := json.MarshalIndent(query, "", " ")
if err != nil {
return nil, err
}
// 替换剩余的模板变量
jsonStr := string(jsonData)
tmpl, err := template.New("query").Parse(jsonStr)
if err != nil {
return nil, err
}
var buf bytes.Buffer
err = tmpl.Execute(&buf, params)
return buf.Bytes(), err
}
这种方法允许你在JSON文件中使用动态变量,并在运行时替换为实际值。模板引擎会自动处理所有{{.FieldName}}格式的变量,将其替换为结构体中对应的值。

