【问题标题】:Unable to unmarshal using viper无法使用 viper 解组
【发布时间】:2021-03-03 05:44:22
【问题描述】:

我一直试图通过解组我的 json 文件来提取一些 JSON,但我不知道为什么它没有发生。我可以使用viper.AllSettings() 获取数据,但不能通过解组。 我认为我犯了一个愚蠢的错误,请分享您的想法。 github链接为-https://github.com/parthw/100-days-of-code/tree/main/golang/d6-cobra-viper-continued,代码如下。

main.go

package main

import (
    "fmt"

    "example.com/cobra-viper/cmd"
    "github.com/spf13/viper"
)

// Myconfig example
type Myconfig struct {
    username string `mapstructure:"username"`
}

func main() {
    cmd.Execute()
    fmt.Println("I can print this ", viper.AllSettings())
    var mc Myconfig
    if err := viper.Unmarshal(&mc); err != nil {
        fmt.Println(err)
    }
    fmt.Println(mc)
}

在 cmd 目录中使用 cobra CLI 生成的代码:

package cmd

import (
    "fmt"
    "os"

    "github.com/spf13/cobra"

    homedir "github.com/mitchellh/go-homedir"
    "github.com/spf13/viper"
)

var (
    cfgFile string
    author  string
)

// Myconfig example
type Myconfig struct {
    username string
}

// rootCmd represents the base command when called without any subcommands
var rootCmd = &cobra.Command{
    Use:   "cobra-viper",
    Short: "A brief description of your application",
    Long: `A longer description that spans multiple lines and likely contains
examples and usage of using your application. For example:

Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.`,
    // Uncomment the following line if your bare application
    // has an action associated with it:
    Run: func(cmd *cobra.Command, args []string) {
        fmt.Println("Welcome to rootcmd")

        var mc Myconfig
        if err := viper.Unmarshal(&mc); err != nil {
            fmt.Println(err)
        }
        fmt.Println(mc)
        fmt.Println("I can print this ", viper.AllSettings())
    },
}

// Execute adds all child commands to the root command and sets flags appropriately.
// This is called by main.main(). It only needs to happen once to the rootCmd.
func Execute() {
    if err := rootCmd.Execute(); err != nil {
        fmt.Println(err)
        os.Exit(1)
    }
    fmt.Println("I can print this ", viper.AllSettings())
}

func init() {
    cobra.OnInitialize(initConfig)

    // Here you will define your flags and configuration settings.
    // Cobra supports persistent flags, which, if defined here,
    // will be global for your application.

    rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.cobra-viper.json)")
    //rootCmd.PersistentFlags().StringVar(&author, "author", "YOUR NAME", "Author name for copyright attribution")

    // Cobra also supports local flags, which will only run
    // when this action is called directly.
    //rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle")
    //viper.BindPFlag("author", rootCmd.PersistentFlags().Lookup("author"))

}

// initConfig reads in config file and ENV variables if set.
func initConfig() {
    if cfgFile != "" {
        // Use config file from the flag.
        viper.SetConfigFile(cfgFile)
    } else {
        // Find home directory.
        home, err := homedir.Dir()
        if err != nil {
            fmt.Println(err)
            os.Exit(1)
        }

        // Search config in home directory with name ".cobra-viper" (without extension).
        viper.AddConfigPath(home)
        viper.SetConfigName(".cobra-viper")
    }

    viper.AutomaticEnv() // read in environment variables that match

    // If a config file is found, read it in.
    if err := viper.ReadInConfig(); err == nil {
        fmt.Println("Using config file:", viper.ConfigFileUsed())
    }

}

输出:

~/Documents/personal-git/100-days-of-code/golang/d6-cobra-viper-continued(main*) » go run main.go                                                                                   
Using config file: /Users/parth/.cobra-viper.json
Welcome to rootcmd
{}
I can print this  map[username:parth-wadhwa]
I can print this  map[username:parth-wadhwa]
I can print this  map[username:parth-wadhwa]
{}

JSON 文件:

~/Documents/personal-git/100-days-of-code/golang/d6-cobra-viper-continued(main*) » cat /Users/parth/.cobra-viper.json                                                              

{
  "username": "parth-wadhwa"
}

【问题讨论】:

    标签: go viper-go cobra


    【解决方案1】:

    您的问题归结为一个事实,即您的 username 结构中的 username 字段是否已导出。它需要大写才能“导出”,以便Unmarshal 将值解码到结构中。

    type Myconfig struct {
        Username string `mapstructure:"username"`
    }
    

    您可以查看 JSON and dealing with unexported fields 以了解更多关于为什么 json 包需要它。

    【讨论】:

    • 谢谢,谢谢!我知道我在做一些愚蠢的事情。我没想到。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 2015-09-26
    • 2018-05-23
    • 2013-08-15
    • 1970-01-01
    相关资源
    最近更新 更多