亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

自定義結構的 UnmarshalYAML 接口的實現

自定義結構的 UnmarshalYAML 接口的實現

Go
神不在的星期二 2022-05-10 13:30:51
我有以下結構、接口和函數:type FruitBasket struct {    Capacity int `yaml:"capacity"`    Fruits []Fruit}type Fruit interface {    GetFruitName() string}type Apple struct {    Name string `yaml:"name"`}func (apple *Apple) GetFruitName() string {    return apple.Name}type tmpFruitBasket []map[string]yaml.Nodefunc (fruitBasket *FruitBasket) UnmarshalYAML(value *yaml.Node) error {    var tmpFruitBasket tmpFruitBasket    if err := value.Decode(&tmpFruitBasket); err != nil {        return err    }    fruits := make([]Fruit, 0, len(tmpFruitBasket))    for i := 0; i < len(tmpFruitBasket); i++ {        for tag, node := range tmpFruitBasket[i] {            switch tag {            case "Apple":                apple := &Apple{}                if err := node.Decode(apple); err != nil {                    return err                }                fruits = append(fruits, apple)            default:                return errors.New("Failed to interpret the fruit of type: \"" + tag + "\"")            }        }    }    fruitBasket.Fruits = fruits    return nil}使用此代碼,我可以解析以下 yaml 文件:FruitBasket:  - Apple:      name: "apple1"  - Apple:      name: "apple2"主要功能如下所示:func main() {    data := []byte(`FruitBasket:  - Apple:      name: "apple1"  - Apple:      name: "apple2"`)    fruitBasket := new(FruitBasket)    err := yaml.Unmarshal(data, &fruitBasket)    if err != nil {        log.Fatalf("error: %v", err)    }    for i := 0; i < len(fruitBasket.Fruits); i++ {        switch fruit := fruitBasket.Fruits[i].(type) {        case *Apple:            fmt.Println("The name of the apple is: " + fruit.GetFruitName())        }    }}但是,我無法解析以下 yaml 字符串:FruitBasket:  capacity: 2  - Apple:      name: "apple1"  - Apple:      name: "apple2"使用此字符串,我收到以下錯誤:error: yaml: did not find expected key.我如何調整 UnmarshalYAML 接口的實現,以解析后面的字符串?
查看完整描述

1 回答

?
呼啦一陣風

TA貢獻1802條經驗 獲得超6個贊

您的 YAML 無效。每個 YAML 值都是標量、序列或映射。


在capacity:處,YAML 處理器在看到第一個鍵時決定此級別包含一個映射?,F在,在下一行,它看到- Apple:一個序列項。這在映射級別內無效;它需要下一個鍵,因此會給您一個錯誤did not find expected key。


結構的修復可能如下所示:


FruitBasket:

  capacity: 2

  items:

  - Apple:

      name: "apple1"

  - Apple:

      name: "apple2"

請注意,序列項仍然出現在同一級別,但是由于items:沒有內聯值,因此這些項被解析為作為 key 值的序列items。同一縮進級別的另一個鍵將結束序列。


然后,您可以將其加載到如下類型:


type tmpFruintBasket struct {

  Capacity int

  Items []map[string]yaml.Node

}


查看完整回答
反對 回復 2022-05-10
  • 1 回答
  • 0 關注
  • 155 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號