前言

使用环境:
IDE:Golang 2020.2.3
Go:go 1.15.3

1.json文件描述

这是从我处理的json文件中截取的第一个小块,也是我解析时用来测试的一小块:

{
	"os_id": "LG01",
	"os": "linux",
	"cmd_info": [{
		"cmd_category_id": "LG0101",
		"cmd_category": "软件/打印/开发/工具",
		"cmd_list": [{
			"cmd_sub_category_id": "LG010101",
			"cmd_sub_category": "Shell内建命令",
			"cmd_sub_list": [{
				"cmd_id": "LG010101001",
				"cmd_name": "pstree",
				"cmd_desc": "pstree将所有行程以树状图显示,树状图将会以 pid (如果有指定) 或是以 init 这个基本行程为根 (root),如果有指定使用者 id,则树状图会只显示该使用者所拥有的行程。",
				"cmd_syntax": "pstree [参数]",
				"cmd_parameters": [{
						"cmd_parameter_key": "-a",
						"cmd_parameter_value": "显示每个程序的完整指令,包含路径,参数或是常驻服务的标示。"
					},
					{
						"cmd_parameter_key": "-c",
						"cmd_parameter_value": "不使用精简标示法。"
					},
					{
						"cmd_parameter_key": "-G",
						"cmd_parameter_value": "使用VT100终端机的列绘图字符。"
					},
					{
						"cmd_parameter_key": "-h",
						"cmd_parameter_value": "列出树状图时,特别标明现在执行的程序。"
					}
				],
				"cmd_examples": "pstree -p",
				"cmd_os": "linux",
				"cmd_type": "1"
			}]
		}]
	}]
}

2.抽出可以在Golang中使用的结构

数组结构的地方我都用的数组进行对应,别的地方用的都是字符串类型:

type Cmd struct {
	Os_id    string    `json:"os_id"`
	Os       string    `json:"os"`
	Cmd_info []Cmd_info `json:"cmd_info"`
}

type Cmd_info struct {
	Cmd_category_id string    `json:"cmd_category_id"`
	Cmd_category   string    `json:"cmd_category"`
	Cmd_list       []Cmd_list `json:"cmd_list"`
}

type Cmd_list struct {
	Cmd_sub_category_id string       `json:"cmd_sub_category_id"`
	Cmd_sub_category   string       `json:"cmd_sub_category"`
	Cmd_sub_list       []Cmd_sub_list `json:"cmd_sub_list"`
}

type Cmd_sub_list struct {
	Cmd_id         string         `json:"cmd_id"`
	Cmd_name       string         `json:"cmd_name"`
	Cmd_desc       string         `json:"cmd_desc"`
	Cmd_syntax     string         `json:"cmd_syntax"`
	Cmd_parameters []Cmd_parameters `json:"cmd_parameters"`
	Cmd_examples   string         `json:"cmd_examples"`
	Cmd_os         string         `json:"cmd_os"`
	Cmd_type	   string         `json:"cmd_type"`
}

type Cmd_parameters struct {
	Cmd_parameter_key   string     `json:"cmd_parameter_key"`
	Cmd_parameter_value string     `json:"cmd_parameter_value"`
}

此处推荐一个网站,可以直接将json反序列化为struct:https://app.quicktype.io/,这样就无需手动创建了。

3.获取json文件路径

我将这个linux_cmd.json放在D:\amf\db\linux_cmd.json中,如图所示:
在这里插入图片描述
此时需要代码获取这个文件的路径:

func file_get_contents(path string) ([]byte, error) {
	f, err := os.Open(path)

	if err != nil {
		return nil, err
	}
	return ioutil.ReadAll(f)
}

4.main函数调用

func main() {
	var c Cmd
	var content []byte
	var err error
    //注意在写路径的时候需要加两个反斜杠
	content, err = file_get_contents("D:\\amf\\db\\linux_cmd.json")
	if err != nil {
		fmt.Println("open file error: " + err.Error())
		return
	}
	err = json.Unmarshal([]byte(content), &c)
	if err != nil {
		fmt.Println("ERROR: ", err.Error())
		return
	}
	fmt.Println(c)
}

至此,使用Golang解析json文件的过程就结束了,控制台会输出相应的内容,我的实验输出结果如下:
在这里插入图片描述
如果想要让输出的方式改变的话,可以在上述代码中更改即可。