首页 > 解决方案 > Go YAML 解析:必填字段

问题描述

总结:我需要将YAML格式的数据解析成golang struct。是否有办法(库、属性)使某些字段成为强制性字段,即如果某些字段不存在,则使 Unmarshal 函数返回错误?

所需示例:此代码中的 Unmarshal 函数应引发错误,因为输入数据不包含“b”字段。

package main

import (
    "fmt"
    "gopkg.in/yaml.v2"
)

type TestStruct struct {
    FieldA string `yaml:"a"`
    FieldB string `yaml:"b"`
}

func main() {
    input := []byte(`{a: 1}`)
    var output TestStruct

    _ = yaml.Unmarshal(input, &output)
}

标签: go

解决方案


您可以使用这个libraryHasZero方法来检查结构中是否有任何缺失值。这将返回真或假,具体取决于结构是否完全填充。请参阅操场示例以获得一个想法。

但是,如果您特别需要说明缺少哪个字段,则需要检查该值是否为 nil,如下例所示。

package main
import (
   "fmt"
   "errors"
  "gopkg.in/yaml.v2"
)

type TestStruct struct {
  FieldA  string `yaml:"a"`
  FieldB  string `yaml:"b"`
}

func main() {
  input := []byte(`{a: 1}`)

  var output TestStruct 
  if err := output.ParseFromFile(input); err != nil {
     fmt.Println(err)
  }
  fmt.Println(output)     
}

func (output *TestStruct) ParseFromFile(data []byte) error {

  if err := yaml.Unmarshal(data, output); err != nil {
    return err
  }

  if output.FieldA == "" {
    return errors.New("Blank Field A")
  }
  if output.FieldB == "" {
    return errors.New("Blank Field B")
  }

  return nil
}

如果您需要专门返回错误,则Playground示例


推荐阅读