Go YAML-разбор: обязательные поля - PullRequest
0 голосов
/ 08 июня 2019

Резюме: Мне нужно проанализировать данные в формате 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)
}

1 Ответ

0 голосов
/ 08 июня 2019

Вы можете использовать этот library HasZero метод, чтобы проверить, есть ли какие-либо пропущенные значения в структуре. Это вернет истину или ложь в зависимости от того, заполнена структура или нет. Пожалуйста, посмотрите игровую площадку пример , чтобы получить представление.

Но если вам необходимо указать, какое поле пропущено, нужно проверить, равно ли это значение нулю, как в примере ниже.

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
}

Детская площадка пример , если вам нужно специально вернуть ошибку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...