【问题标题】:Parse yaml return empty object解析 yaml 返回空对象
【发布时间】:2023-03-11 05:09:01
【问题描述】:

我有以下需要解析为结构的 yaml。 在 builds 属性中,我在调试时得到了空值,我在这里缺少什么?

我使用“gopkg.in/yaml.v2”

- name: srv
    type: java
    path: srv
    builds:
     - name: db
        properties:
           JBR_CONFIG_RESOURCE_CONFIG: '[META-INF/context.xml:
              {"service_name" : "~{h-container}"}]'
           TEST2: aaaa

结构是

type Runs struct {
    Name       string
    Type       string
    Path       string     `yaml:"path,omitempty"`
    Builds   []Builds `yaml:”builds,omitempty"`
}

type Builds struct {
    Name       string     `yaml:"name,omitempty"`
    Properties Properties `yaml:"properties,omitempty"`
}

type Properties map[string]string

【问题讨论】:

  • 请分享您的尝试...

标签: go yaml


【解决方案1】:

正确格式化的 yaml 是您应该考虑的第一件事。 如果你想拥有一个Runs,你应该让你的 yaml 格式类似

name: srv
builds:
  -
    name: db
    properties:
      JBR_CONFIG_RESOURCE_CONFIG: "[META-INF/context.xml:
      {\"service_name\" : \"~{h-container}\"}]"
      TEST2: aaaa
path: srv
type: java

但是我想拥有更多这个对象,你需要将它们分组到一个参数中。它可以是这样的

runs:
  -
    name: srv
    builds:
      -
        name: db
        properties:
          JBR_CONFIG_RESOURCE_CONFIG: "[META-INF/context.xml:
          {\"service_name\" : \"~{h-container}\"}]"
          TEST2: aaaa
    path: srv
    type: java
  -
    name: srv2
    builds:
      -
        name: db2
        properties:
          JBR_CONFIG_RESOURCE_CONFIG: "[META-INF/context.xml:
          {\"service_name\" : \"~{h-container}\"}]"
          TEST2: aaaa2
    path: srv2
    type: java2

然后在你的代码中可能看起来像这样

package main

import (
    "fmt"
    "gopkg.in/yaml.v2"
    "io/ioutil"
    "log"
    "os"
)

type Document struct {
    Runs []Runs `yaml:"runs,omitempty"`
}
type Runs struct {
    Name   string   `yaml:"name,omitempty"`
    Type   string   `yaml:"type,omitempty"`
    Path   string   `yaml:"path,omitempty"`
    Builds []Builds `yaml:"builds,omitempty"`
}

type Builds struct {
    Name       string            `yaml:"name,omitempty"`
    Properties map[string]string `yaml:"properties,omitempty"`
}

func main() {

    var document Document
    reader, err := os.Open("demo.yml")
    if err != nil {
        log.Fatal(err)
    }
    buf, _ := ioutil.ReadAll(reader)
    yaml.Unmarshal(buf, &document)
    if err := yaml.Unmarshal(buf, &document); err != nil {
        fmt.Print(err)
        os.Exit(1)
    }
    fmt.Println(document)
}

【讨论】:

  • 谢谢 1+,我的 yaml 是有效的,也许问题的副本会改变它,但我能够解析它,否则我猜如果 Unmarshal 失败,我会得到错误......任何知道它可能是什么?您是否更改了结构中的某些内容?
  • 如果您不明确检查yaml.Unmarshal 是否返回错误,您的代码将使用空的Runs。如果检查我的代码,我添加了这个
  • 当然可以发给我
  • 我可以通过聊天或其他方式发送吗?
【解决方案2】:

确保您的 yaml 文件格式正确。请与此tool 联系。

以下代码运行良好。

package main

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

type Runs struct {
    Name   string
    Type   string
    Path   string   `yaml:"path,omitempty"`
    Builds []Builds `yaml:”builds,omitempty"`
}

type Builds struct {
    Name       string     `yaml:"name,omitempty"`
    Properties Properties `yaml:"properties,omitempty"`
}

type Properties map[string]string

func main() {
    data := `builds: 
  - 
    name: db
    properties: 
      JBR_CONFIG_RESOURCE_CONFIG: "[META-INF/context.xml: {\"service_name\" : \"~{h-container}\"}]"
      TEST2: aaaa
name: srv
path: srv
type: java
`

    runs := Runs{}

    err := yaml.Unmarshal([]byte(data), &runs)
    if err != nil {
        log.Fatalf("error: %v", err)
    }
    fmt.Printf("--- t:\n%v\n\n", runs)
    d, err := yaml.Marshal(&runs)
    if err != nil {
        log.Fatalf("error: %v", err)
    }
    fmt.Printf("--- t dump:\n%s\n\n", string(d))
}

我希望这会有所帮助!

【讨论】:

  • 谢谢 1+,我的 yaml 是有效的,也许问题的副本会改变它,但我能够解析它,否则我猜如果 Unmarshal 失败,我会得到错误......任何知道它可能是什么?
猜你喜欢
  • 1970-01-01
  • 2020-03-03
  • 2012-10-30
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
  • 2020-01-29
  • 1970-01-01
  • 2016-09-12
相关资源
最近更新 更多