Golang解析带变量的JSON配置文件

Golang解析带变量的JSON配置文件

你好

我有一个配置文件(JSON格式),需要在其中设置一些变量,这些变量应该在读取完成后被填充。

例如:{"data":"一些变量"}

如何以语法正确的方式在JSON配置文件中写入变量,然后在读取文件并解组时如何填充这些变量。

谢谢
6 回复

感谢。这个库解决了问题 😊

更多关于Golang解析带变量的JSON配置文件的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


@NobbZ 你的意思是我必须遍历 JSON 字符串并用变量替换它,没有其他解决方案吗?

谢谢

我想我有点误解你的意思了。

我以为你想要展开环境变量,但看起来你似乎想要展开任意变量。

那么你需要完全自己构建这个功能。

你需要自行展开变量,JSON本身没有内置这种功能。

要在解组期间或之后实际展开shell变量,只需调用os.ExpandEnv

func main() {
    fmt.Println("hello world")
}

嗯,通过快速搜索我找到了 github.com/buildkite/interpolate

不过我还没有实际使用过它。根据你的描述,这个库看起来能够满足你的需求。

从示例来看,你需要先准备好环境变量,然后显式地将其传递给替换器。

在Go语言中,JSON配置文件本身不支持变量替换功能,但可以通过预处理或自定义解组逻辑来实现类似需求。以下是两种常见方法:

方法1:使用模板预处理(推荐)

先将配置文件作为模板处理,替换变量后再解析为JSON。

示例代码:

package main

import (
    "encoding/json"
    "os"
    "text/template"
    "bytes"
)

type Config struct {
    Data string `json:"data"`
}

func main() {
    // 定义变量
    vars := map[string]string{
        "version": "v1.2.3",
        "path":    "/usr/local",
    }

    // 读取模板文件
    tplContent, _ := os.ReadFile("config.json.tpl")
    
    // 执行模板替换
    tpl, _ := template.New("config").Parse(string(tplContent))
    var buf bytes.Buffer
    tpl.Execute(&buf, vars)
    
    // 解析JSON
    var config Config
    json.Unmarshal(buf.Bytes(), &config)
    
    println(config.Data) // 输出替换后的内容
}

模板文件 config.json.tpl

{
    "data": "版本: {{.version}}, 路径: {{.path}}"
}

方法2:自定义JSON解组

先解析为中间结构,再手动处理变量。

示例代码:

package main

import (
    "encoding/json"
    "os"
    "strings"
)

type RawConfig struct {
    Data string `json:"data"`
}

type Config struct {
    Data string
}

func main() {
    content, _ := os.ReadFile("config.json")
    
    var raw RawConfig
    json.Unmarshal(content, &raw)
    
    // 手动替换变量
    config := Config{
        Data: strings.ReplaceAll(raw.Data, "${version}", "v1.2.3"),
    }
    
    println(config.Data)
}

配置文件 config.json

{
    "data": "版本: ${version}"
}

选择哪种方法取决于具体需求。模板方式更灵活,适合复杂替换;自定义解组更直接,适合简单场景。

回到顶部