Go语言读取YAML文件时bUnits数组反序列化失败,数据为空求指导
YAML数组反序列化为空的解决方法
问题场景
读取YAML文件时,version字段能正常反序列化,但bUnits数组始终为空。
YAML文件内容
--- version: "1.2" bUnits: - name: buname buGroupID: asd buStGroupID: asd - name: buname2 buGroupID: asd2 buStGroupID: asd2
原Go代码
type SResponse struct { Version string `json:"version"` BUnits []BUnit `json:"bUnits"` } type BUnit struct { Name string `json:"name"` BuUnitGroupID string `json:"buGroupID"` BuUnitStGroupID string `json:"buStaticGroupID"` } func main() { _printf := fmt.Printf _printf("Start") var sListResponse SResponse source, err2 := ioutil.ReadFile("squads2.yml") if err2 != nil { _printf("Couldn't read yaml file.") } err2 = yaml.Unmarshal(source, &sListResponse) if err2 != nil { _printf("Error") } _printf("Output: %s\n", sListResponse) }
问题原因
- 结构体标签错误:使用了
json:"xxx"标签,但yaml.Unmarshal只会识别yaml:"xxx"标签,导致字段映射失败。 - 字段键名不匹配:
BUnit结构体中BuUnitStGroupID的标签是buStaticGroupID,但YAML中对应的键是buStGroupID,两者不一致。 - 结构体打印方式错误:用
%s打印结构体只会输出类型名,无法看到实际字段内容,排查问题时容易误判。
修正后的代码
import ( "fmt" "io/ioutil" "gopkg.in/yaml.v2" ) type SResponse struct { Version string `yaml:"version"` BUnits []BUnit `yaml:"bUnits"` } type BUnit struct { Name string `yaml:"name"` BuUnitGroupID string `yaml:"buGroupID"` BuUnitStGroupID string `yaml:"buStGroupID"` } func main() { _printf := fmt.Printf _printf("Start\n") var sListResponse SResponse source, err2 := ioutil.ReadFile("squads2.yml") if err2 != nil { _printf("Couldn't read yaml file: %v\n", err2) return } err2 = yaml.Unmarshal(source, &sListResponse) if err2 != nil { _printf("Unmarshal error: %v\n", err2) return } _printf("Output: %+v\n", sListResponse) }
关键修改点
- 将所有结构体标签从
json:"xxx"替换为yaml:"xxx",确保YAML解析器能正确映射字段。 - 修正
BUnit中BuUnitStGroupID的标签为yaml:"buStGroupID",和YAML文件中的键名完全匹配。 - 打印结构体时使用
%+v格式符,能输出结构体的所有字段和对应值。 - 增加错误信息的详细打印,方便快速定位问题。
内容的提问来源于stack exchange,提问作者Piyush
相关产品推荐
相关产品推荐

