You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 13:37:34