解析JSON配置文件到映射到结构体
-
编写json配置文件,我这里是链接数据库的配置文件。
{ "user": "root", "password": "root", "ip": "127.0.0.1", "port": "3306", "DB_name": "test" }
-
创建解析json文件函数
ReadDbConfFile.go
。package conf import ( "encoding/json" "fmt" "io/ioutil" "os" "path" "runtime" ) //注意 结构体的定义变量为大驼峰 type DbConf struct { User string `json:"user"` Password string `json:"password"` Ip string `json:"ip"` Port string `json:"port"` DBName string `json:"DB_name"` } /** 连接数据库 */ func init() { _, filename, _, ok := runtime.Caller(0) if !ok { panic("No caller information") } dir := path.Dir(filename) fmt.Println(fmt.Printf("获取DB的配置的目录是: %s ", dir)) jsonFile := dir + "/db.json" fmt.Println("dbConfFilePath is %S", jsonFile) dbConfFile, _ := os.Open(jsonFile) defer dbConfFile.Close() // 函数执行结束之前关闭流 // 创建json解码器 byteValue, _ := ioutil.ReadAll(dbConfFile) fmt.Println(string(byteValue)) var dbConfContent DbConf err := json.Unmarshal([]byte(byteValue), &dbConfContent) if err != nil { fmt.Println("json 转化为struct 失败 ", nil) } fmt.Println(dbConfContent) fmt.Println(dbConfContent.User) fmt.Println(dbConfContent.Password) fmt.Println(dbConfContent.Ip) fmt.Println(dbConfContent.Port) fmt.Println(dbConfContent.DBName) }
-
创建测试单元函数
ReadDbConfFile_test.go
。package test import ( "fmt" "testing" _ "yun/conf" ) //_ "yun/conf" 是导入包, 在执行 Test_ReadJsonFile 函数之前会先加载_ "yun/conf" 包 ,在加载包之后 // 会初始化执行 init 函数 func Test_ReadJsonFile(test *testing.T) { fmt.Println("测试输出") }
结果:
获取DB的配置的目录是: D:/workspaces/go/src/yun/conf 61 <nil>
dbConfFilePath is %S D:/workspaces/go/src/yun/conf/db.json
{
"user": "root",
"password": "root",
"ip": "127.0.0.1",
"port": "3306",
"DB_name": "test"
}
{root root 127.0.0.1 3306 test}
root
root
127.0.0.1
3306
test
=== RUN Test_ReadJsonFile
测试输出
--- PASS: Test_ReadJsonFile (0.00s)
PASS
Process finished with exit code 0