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 上对你代码的转换:

Go Playground - The Go Programming Language

更多关于Golang解析JSON配置文件时遇到问题求帮助的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你的问题在于结构体字段类型定义不正确。JSON中的enduserkeyuser都是字符串数组([]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)
}

主要修改:

  1. 将结构体中的EnduserKeyuser字段类型从string改为[]string
  2. 改进了错误处理,避免使用panic
  3. 使用%+v格式化输出可以显示结构体的字段名和值

运行修正后的代码,你将看到正确解析的JSON数据。

回到顶部