前言
使用环境:
IDE:Goland 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文件的过程就结束了,控制台会输出相应的内容,我的实验输出结果如下:
如果想要让输出的方式改变的话,可以在上述代码中更改即可。