猿问

如何解析yaml并获取接口深层结构的价值

我正在尝试解析此 yaml,但我想获取values条目run(test1 或 test2)但没有成功,这是我的工作示例。

我有点迷失了 map inside map :( ,这是给定的 yaml,我无法更改...

知道我怎么能得到这些值

package main


import (

    "fmt"

    "log"


    "gopkg.in/yaml.v2"

)


var runContent = []byte(`

version: "3.2"


run-parameters:

  before:

    run-parameters:

      run: test1


  after:

    run-parameters:

      run: test2


`)


type FTD struct {

    Version     string     `yaml:"version,omitempty"`

    BuildParams *RunParams `yaml:"run-parameters,omitempty"`

}


type RunParams struct {

    BeforeExec map[string]interface{} `yaml:"before,omitempty"`

    AfterExec map[string]interface{} `yaml:"after,omitempty"`

}


func main() {

    runners := &FTD{}

    // parse mta yaml

    err := yaml.Unmarshal(runContent, runners)

    if err != nil {

        log.Fatalf("Error : %v", err)

    }

    for k, v := range runners.BuildParams.BeforeExec {

        fmt.Println(k, v.(interface{}))

    }

}

这是工作示例 https://play.golang.org/p/qTqUJy3md0c

我也试过

这是工作

run := runners.BuildParams.BeforeExec["run-parameters"].(map[interface{}]interface{})["run"]
     fmt.Println("run: ", run)

我试过的是这个有效但如果run值为空或根本没有条目会发生什么,这将导致转储 我如何克服这个问题?


蝴蝶不菲
浏览 121回答 1
1回答

白猪掌柜的

我试过的是这个有效但如果运行值为空或根本没有条目会发生什么,这将导致转储我该如何克服这个问题?你可以做runParams, ok := runners.BuildParams.BeforeExec["run-parameters"]if !ok {    // handle lack of "run-parameters" in BeforeExec}runParamsMap, ok := runParams.(map[interface{}]interface{})if !ok {    // handle "run-parameters" not being a map}run, ok := runParamsMap["run"]if !ok {    // handle lack of "run" inside "run-parameters"}runStr, ok := run.(string)if !ok {    // handle "run" not being a string}fmt.Println("run: ", runStr)这非常冗长,因此您可以使用类似https://github.com/jmoiron/jsonq 的内容,您可以在其中指定嵌套在多个地图级别内的所需值的“路径”。尽管名称中有“json”,但这个库使用 map[string]interface{} 而不是 json 文件。但请注意,您用于 yaml 解组的库结果不是map[interface{}]interface{},map[string]interface{}您必须使用不同的库才能使其与 jsonq 一起使用。run, err := jsonq.NewQuery(runners.BuildParams.BeforeExec).String("run-parameters", "run")if err != nil {    // handle all possible errors in one place}fmt.Println("run: ", run)
随时随地看视频慕课网APP

相关分类

Go
我要回答