目录

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