json作为如此简单灵活且又具备丰富语义的数据格式,但golang作为编译型语言,要求事先定义对应结构体才能正常从json解析到struct,官方没有提供这样的模块。
只能手动来转换。为什么不用ini、yaml,他们可以做一些简单配置文件,但一旦复杂的配置,层级多,包含string、int、数组、map键值对等嵌套的配置,我们觉得json是最为简单灵活易读的数据格式。
json配置文件
pdd.json
{
"pids":{
"default":{
"pid":"1844_71935560",
"desc":"app1"
},
"shehui":{
"pid":"1844_101751664",
"desc":"app2"
}
},
"top_words":[
"邓紫棋",
"沈腾",
"关晓彤",
"鹿晗"
]
}
根据json预定义struct
type configuration struct {
Pids struct {
Default struct {
Pid string `json:"pid"`
Desc string `json:"desc"`
} `json:"default"`
Shehui struct {
Pid string `json:"pid"`
Desc string `json:"desc"`
} `json:"shehui"`
} `json:"pids"`
TopWords []string `json:"top_words"`
}
通过json转struct工具转换:
json转换成struct
package main
import (
"encoding/json"
"fmt"
"os"
)
type configuration struct {
Pids struct {
Default struct {
Pid string `json:"pid"`
Desc string `json:"desc"`
} `json:"default"`
Shehui struct {
Pid string `json:"pid"`
Desc string `json:"desc"`
} `json:"shehui"`
} `json:"pids"`
TopWords []string `json:"top_words"`
}
func parseJsonConfig(filepath string) (conf configuration) {
// 打开文件
file, _ := os.Open(filepath)
// 关闭文件
defer file.Close()
conf = configuration{}
//NewDecoder创建一个从file读取并解码json对象的*Decoder,解码器有自己的缓冲,并可能超前读取部分json数据。
//Decode从输入流读取下一个json编码值并保存在v指向的值里
err := json.NewDecoder(file).Decode(&conf)
if err != nil {
fmt.Println("Error:", err)
}
return
}
func main() {
pdd := parseJsonConfig("pdd.json")
fmt.Println(pdd)
fmt.Println(pdd.Pids.Shehui.Pid)
}
输出
$ go run .\test.go
{{{1844_71935560 app1} {1844_101751664 app2}} [邓紫棋 沈腾 关晓彤 鹿晗]}
1844_101751664