从JSON获取值的JSON路径

时间:2018-07-11 09:22:43

标签: go yaml

我正在尝试编写一个函子以从yaml文件中获取值的所有路径,但我不知道怎么可能,这是我的代码:

func getpath(fileyaml) string {

   if _, err := os.Stat(fileyaml); err == nil {
   bfile, err := ioutil.ReadFile(fileyaml)
   bjson, err := yaml.YAMLToJSON(bfile)
   if err != nil {
      fmt.Printf("YAMLToJSON err: %v\n", err)
   }

   json := string(bjson)

   println json
   paths := ? // don't know 
    return path 

这是我的yaml文件:

sentinel:
  number: 3
server:
  number: 7
config:
  fere_size: 5
lcmea:
  eza_ze: all

我的函数会将其转换为json:{"config":{"fere_size":5},"lcmea":{"eza_hooks":"all"},"sentinel":{"number":3},"server":{"number":7}}

我想要的输出:

sentinel.number=3, server.number=3,config.fere_size=5,lcmea.eza_ze=all

如何解析此json以获得所需的输出?

我正在使用“ github.com/tidwall/gjson”读取Yaml并将其转换为json

1 个答案:

答案 0 :(得分:0)

这是您如何执行此操作的示例:https://play.golang.org/p/7yLq_PDLdXF

这很幼稚,肯定可以改进,但是它可以使您了解如何解析yaml文件,然后以所需的格式打印输出:

package main

import (
    "fmt"
    "log"
    "strings"

    "github.com/go-yaml/yaml"
)

var data = `
sentinel:
  number: 3
server:
  number: 7
config:
  fere_size: 5
lcmea:
  eza_ze: all
`

func main() {
    m := make(map[string]map[string]interface{})

    err := yaml.Unmarshal([]byte(data), &m)
    if err != nil {
        log.Fatalf("error: %v", err)
    }

    out := []string{}
    for k, v := range m {
        for j, i := range v {
            out = append(out, fmt.Sprintf("%s.%v=%v", k, j, i))
        }
    }

    fmt.Println(strings.Join(out, ", "))
}

它将返回:

$ go run main.go
sentinel.number=3, server.number=7, config.fere_size=5, lcmea.eza_ze=all

它正在使用https://github.com/go-yaml/yaml,请在README.md上查看更多示例