dousuowu4610
2018-02-24 08:40
浏览 652
已采纳

解析动态Yaml文件

I have a yaml file that is currently written as:

    keys:
        - key: secret/dog
          values:
            - username: shiba
            - password: inu
        - key: secret/cat
          values:
            - dbhost: localhost
            - words: meow

However, this yaml file often changes, so new entries could be added with different values each time:

    keys:
        - key: secret/dog
          values:
            - username: shiba
            - password: inu
        - key: secret/cat
          values:
            - dbhost: localhost
            - words: meow
        - key: secret/mouse
          values:
            - color: white
        - key: secret/clouds
          values:
            - type: fluffy

I know from go using the gopkg.in/yaml.v2 package, i can parse through the yaml file, if all the values are the same, for example:

            type Secrets struct {
                Keys []struct {
                    Key    string `json:"key"`
                    Values []struct {
                        Username string `json:"username"`
                        Password string `json:"password"`
                    } `json:"values"`
                } `json:"keys"`
            }

            func main() {

                var secret Secrets
                reader, err := os.Open("demo.yml")
                if err != nil {
                    log.Fatal(err)
                }
                buf, _ := ioutil.ReadAll(reader)
                yaml.Unmarshal(buf, &secret)

                fmt.Printf("%+v
", secret.Keys[1].Key)

            }

In the example above, it would only work for the secret/dog key, but not the others.

How can I do this in Go, when new values are added to my yaml file often?

Thanks

  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 邀请回答

1条回答 默认 最新

  • dqw7121 2018-02-24 09:33
    最佳回答

    If you don't now exact struct you should probably make your struct looking like this

    type Secrets struct {
        Keys []struct {
            Key    string `json:"key"`
            Values []map[string]string `json:"values"`
        } `json:"keys"`
    }
    

    It will parse your whole yaml and get all values, but it will be an array so you loosing type hinting on object. Other way arround would be advance endoding https://blog.gopheracademy.com/advent-2016/advanced-encoding-decoding/ but you will need to add new object every time new key/value pair will appear.

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题