Golang解析JSON配置文件时遇到问题求帮助
Golang解析JSON配置文件时遇到问题求帮助 大家好,我是Go语言的新手,遇到了一个我不理解的问题。 我有一个名为 conf.json 的JSON配置文件。 还有一个 main.go 文件。main.go 应该导入配置文件并打印出结构体。 但是 Config 结构体是空的。 为什么?我的错误在哪里?
提前感谢。
{
"ca":{
"enduser":["a_wi_basic_productsuite",
"a_wi_basic_wb",
"a_wi_end_ewd",
"a_wi_end_fbf",
"a_wi_end_wb",
"a_wi_end_wt",
"a_wi_basic_productsuite",
"a_wi_basic_wb",
"a_wi_end_ewd",
"a_wi_end_fbf",
"a_wi_end_star",
"a_wi_end_wb",
"a_wi_end_wt"],
"keyuser":["rsi_wi_dev",
"a_wi_key_wb",
"a_wi_key_geof",
"a_wi_key_geof",
"a_wi_key_wb"]
},
"fv":{
"enduser":["bFV_FLT_OI_END_ALL",
"bFV_FLT_OI_END_ALL"],
"keyuser":["bFV_FLT_OI_KEY_ALL",
"FV_ALL_DEV_ALL",
"a_FV_ALL_DEV_ALL"]
},
"ri":{
"enduser":["a_ri_fv_end_fv",
"a_ri_pz_light_advanced",
"a_ri_pz_light_advanced",
"a_ri_pz_light_basic",
"a_ri_pz_light_basic",
"a_ri_ro_end_bay",
"a_ri_ro_end_bw",
"a_ri_ro_end_mit",
"a_ri_ro_end_no",
"a_ri_ro_end_nord",
"a_ri_ro_end_nrw",
"a_ri_ro_end_sbb",
"a_ri_ro_end_sbhh",
"a_ri_ro_end_sbkhb",
"a_ri_ro_end_sbm",
"a_ri_ro_end_sbrhm",
"a_ri_ro_end_sbs",
"a_ri_ro_end_so",
"a_ri_ro_end_systec",
"a_ri_ro_end_wfb"],
"keyuser":["a_ri_fbf_power",
"a_ri_fv_key_fv",
"a_ri_ro_key_bay",
"a_ri_ro_key_bw",
"a_ri_ro_key_mit",
"a_ri_ro_key_no",
"a_ri_ro_key_nord",
"a_ri_ro_key_nrw",
"a_ri_ro_key_sbb",
"a_ri_ro_key_sbhh",
"a_ri_ro_key_sbkhb",
"a_ri_ro_key_sbm",
"a_ri_ro_key_sbrhm",
"a_ri_ro_key_sbs",
"a_ri_ro_key_so",
"a_ri_ro_key_systec",
"a_ri_ro_key_wfb"]
}
}
// ------- end conf.json ------
// ------ start main.go-------
package main
import (
"encoding/json"
"fmt"
"os"
)
type Config struct {
Ca struct {
Enduser string `json:"enduser"`
Keyuser string `json:"keyuser"`
} `json:"ca"`
Fv struct {
Enduser string `json:"enduser"`
Keyuser string `json:"keyuser"`
} `json:"fv"`
Ri struct {
Enduser string `json:"enduser"`
Keyuser string `json:"keyuser"`
} `json:"ri"`
}
func LoadConfiguration(file string) (Config, error) {
var config Config
configFile, err := os.Open(file)
defer configFile.Close()
if err != nil {
fmt.Println(err.Error())
panic("Config file not loadable")
}
jsonParser := json.NewDecoder(configFile)
jsonParser.Decode(&config)
return config, err
}
func main() {
fmt.Println("Starting the Application....")
config, _ := LoadConfiguration("./conf.json")
fmt.Println(config)
}
//--------END main.go
//------ Screen Output ----
fl@Pearbook splunkuser % go run main.go
Starting the Application....
{{ } { } { }}
fl@Pearbook splunkuser % ´´´
更多关于Golang解析JSON配置文件时遇到问题求帮助的实战教程也可以访问 https://www.itying.com/category-94-b0.html
2 回复
Frank_Lohfeld:
jsonParser.Decode(&config)
检查这里返回的错误。
它会告诉你,它遇到了一个数组,但期望的是一个字符串。可以参考我在 Go Playground 上对你代码的转换:
更多关于Golang解析JSON配置文件时遇到问题求帮助的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你的问题在于结构体字段类型定义不正确。JSON中的enduser和keyuser都是字符串数组([]string),但你在结构体中定义为了string类型。
这是修正后的代码:
package main
import (
"encoding/json"
"fmt"
"os"
)
type Config struct {
Ca struct {
Enduser []string `json:"enduser"`
Keyuser []string `json:"keyuser"`
} `json:"ca"`
Fv struct {
Enduser []string `json:"enduser"`
Keyuser []string `json:"keyuser"`
} `json:"fv"`
Ri struct {
Enduser []string `json:"enduser"`
Keyuser []string `json:"keyuser"`
} `json:"ri"`
}
func LoadConfiguration(file string) (Config, error) {
var config Config
configFile, err := os.Open(file)
if err != nil {
return config, err
}
defer configFile.Close()
jsonParser := json.NewDecoder(configFile)
err = jsonParser.Decode(&config)
return config, err
}
func main() {
fmt.Println("Starting the Application....")
config, err := LoadConfiguration("./conf.json")
if err != nil {
fmt.Printf("Error loading config: %v\n", err)
return
}
// 打印整个配置
fmt.Printf("Config: %+v\n", config)
// 或者打印特定字段
fmt.Printf("CA Enduser: %v\n", config.Ca.Enduser)
fmt.Printf("CA Keyuser: %v\n", config.Ca.Keyuser)
}
主要修改:
- 将结构体中的
Enduser和Keyuser字段类型从string改为[]string - 改进了错误处理,避免使用
panic - 使用
%+v格式化输出可以显示结构体的字段名和值
运行修正后的代码,你将看到正确解析的JSON数据。


