JSON config in Go

137 阅读1分钟

记录配置文件在 Go 语言的应用

JSON

模板 JSON 文件如下

{
    "year":{
        "minyear": 2012,
        "maxyear": 2022
    },
    "month":{
        "January": "", 
        "February": ""
    }
}

首先观察一个这个 JSON 文件

想取出获取这个 JSON 文件的内容,我们应该做如下几个操作

  • 打开文件
  • 读取文件内容
  • 对内容进行解析

打开文件

首先打开文件

//filePath is your config file path
file, err := os.Open(filePath)
if err != nil {
    log.Println(err)
    return nil, errors.New("open error")
}
defer file.Close()

这里我们获取到一个 *os.File 的对象 file

读取文件

将打开的 file 写入我们已定义的类型中,我们可以应用 map[string]interface{} 存放

var jsonData map[string]interface{}
//the type of jsoned is []byte 
jsoned, err := ioutil.ReadAll(file)
if err != nil {
    log.Panicln(err)
    return nil, errors.New("read error")
}
//need unmarshal
err = json.Unmarshal(jsoned, &jsonData)
if err != nil {
    log.Println(err)
    return nil, errors.New("unmarshal error")
}

现在我们就将 JSON 文件导入到了我们的类型为 map[string]interface{} 的对象中

解析数据

我们知道我们获得的 map[string]interface{} 中 key 的类型为 string ,value 的类型是 interface{} 。

但是要想获得 interface{} 的内容, 我们需要先进行一步类型断言。

我们可以通过 reflect 包查看以下类型

yearMap := dateMap["year"]
fmt.Println(reflect.TypeOf(yearMap))

可以得到类型为 map[string]interface{}

yearMap := dateMap["year"].(map[string]interface{})
//number is float64 in go
yearDataMao := yearMap["minyear"].(float64)

获得结果 2012。