我有以下結構、接口和函數: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
}
- 1 回答
- 0 關注
- 155 瀏覽
添加回答
舉報
0/150
提交
取消