如何使用golang读取JSON文件中的环境变量?

时间:2018-07-18 15:55:24

标签: json go environment-variables

有什么方法可以将占位符放入json文件中,以便我们可以动态填充值? 例如

{
   "name": "{{$name}}"
}

在这里{{$name}}是一个占位符

1 个答案:

答案 0 :(得分:2)

是的,您应该能够使用文本/模板https://golang.org/pkg/text/template/

您将能够定义json模板文件,例如:

// JSON file: user.tpl.json
{
    "username": "{{ .Username }}",
    "password": "{{ .PasswordHash }}",
    "email": "{{ Email }}",
}

我们假设以下数据结构:

type User struct {
    Username string
    Password []byte // use a properly hashed password (bcrypt / scrypt)
    Email string
}

要使用模板:

// parse the template
tpl, err := template.ParseFiles("user.tpl.json")
if err != nil {
    log.Fatal(err)
}

// define some data for the template, you have 2 options here:
// 1. define a struct with exported fields,
// 2. use a map with keys corresponding to the template variables
u := User {
    Username: "ThereIsNoSpoon",
    Password: pwdHash, // obtain proper hash using bcrypt / scrypt
    Email: nospoon@me.com,
}

// execute the template with the given data
var ts bytes.Buffer
err = tpl.Execute(&ts, u)  // Execute will fill the buffer so pass as reference
if err != nil {
    log.Fatal(err)
}

fmt.Printf("User JSON:\n%v\n", ts.String())

上面的代码应产生以下输出:

User JSON:
{
    "username": "ThereIsNoSpoon",
    "Password": "$2a$10$SNCKzLpj/AqBJSjVEF315eAwbsAM7nZ0e27poEhjhj9rHG3LkZzxS",
    "Email": "nospoon@me.com"
}

您的模板变量名称必须与您传递给Execute的数据结构的导出值相对应。示例密码哈希是字符串“ BadPassword123”上的10轮bcrypt。使用字节。 Buffer允许灵活使用,例如使用String()函数通过网络传递,写入文件或显示到控制台。

对于环境变量,我建议第二种方法,即golang映射:

// declare a map that will serve as the data structure between environment
// variables and the template
dmap := make(map[string]string)

// insert environment variables into the map using a key relevant to the
// template
dmap["Username"] = os.GetEnv("USER")
// ...

// execute template by passing the map instead of the struct