【问题标题】:parse yaml structs error解析 yaml 结构错误
【发布时间】:2019-01-20 09:04:40
【问题描述】:

我有以下 yaml ,当我尝试解析它时出现错误,知道这里可能缺少什么吗?我不确定如何构造区域属性。

T这是有效的 yaml

https://codebeautify.org/yaml-validator/cb42f23a

错误:

模型 extConfigYaml 中的错误:*yaml:第 4 行:映射值不是 在这种情况下允许

type ExternalConfig struct {
    Landscape zone `yaml:"Landscape"`
}


type zone struct {
    zone models `yaml:"zone"`
}

type models struct {
    models []Model `yaml:"models"`
}

type Model struct {
    AppType     string `yaml:"app-type"`
    ServiceType string `yaml:"service-type"`
}

var external_config = []byte(`
Landscape:
  zone: zone1
   models:
    - app-type: app1
      service-type: GCP

    - app-type: app2
      service-type: AMAZON

  zone: zone2
   models:
    - app-type: app3
      service-type: AZURE
    - app-type: app4Í
      service-type: HEROKU
`)


extConfigYaml := ExternalConfig{}

err = yaml.Unmarshal([]byte(external_config), &extConfigYaml)
if err != nil {
    log.Fatalf("error in model extConfigYaml: %v", err)
}
fmt.Printf("%+v\n", extConfigYaml)

【问题讨论】:

  • 标识很可能不正确。如果从models: 行的开头删除一个空格,它就会变得清晰且可解析。
  • codebeautify 使用了有缺陷的 PHP YAML 解析器。通常,使用该站点无法保证您的 YAML 是否有效,如果它在那里解析,则不能保证。也没有理由不只是在您的问题中包含那个小的 YAML 文档。一旦 codebeautify 网站出现故障,您的问题对这里的访问者来说就变得毫无用处。

标签: go struct yaml


【解决方案1】:

根据错误:

模型 extConfigYaml 中的错误:*yaml:第 4 行:映射值不是 在这种情况下允许

您提供的 yaml 内容的缩进存在错误,其中 models 缩进级别应与 zone 缩进级别匹配。除此之外,无需为zone 创建结构,因为它是一个字符串值,但您已为其分配了一个包含models 数据的model 结构。此外,您应该使用大写字母导出结构。

将你的代码修改为以下代码:

package main

import (
    "fmt"
    "log"

    "gopkg.in/yaml.v2"
)

type ExternalConfig struct {
    Landscape Zone `yaml:"Landscape"`
}

type Zone struct {
    Zone   string  `yaml:"zone"`
    Models []Model `yaml:"models"`
}

type Model struct {
    AppType     string `yaml:"app-type"`
    ServiceType string `yaml:"service-type"`
}

var external_config = []byte(`
Landscape:
  zone: zone1
  models:
    - app-type: app1
      service-type: GCP
    - app-type: app2
      service-type: AMAZON
  zone: zone2
  models:
    - app-type: app3
      service-type: AZURE
    - app-type: app4Í
      service-type: HEROKU
`)

func main() {

    extConfigYaml := ExternalConfig{}

    err := yaml.Unmarshal(external_config, &extConfigYaml)
    if err != nil {
        log.Fatalln("error in model extConfigYaml: %v", err)
    }
    fmt.Printf("%+v\n", extConfigYaml)
}

Playground 上的工作代码

【讨论】:

    猜你喜欢
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 2021-01-11
    • 2018-10-13
    • 2011-06-26
    • 1970-01-01
    相关资源
    最近更新 更多