为了账号安全,请及时绑定邮箱和手机立即绑定

如何解析下面格式的json数组

如何解析下面格式的json数组

Go
白猪掌柜的 2023-07-26 16:45:19
 {    "machines": [{        "name": "relay_1",        "totalmem": "3G",        "machinemem": "6G"    }, {        "name": "relay_2",        "totalmem": "30G",        "machinemem": "4G"    }]}尝试使用下面的代码进行解析Run: func(cmd *cobra.Command, args []string) {                fmt.Println("relay called")                conf, _ = rootCmd.Flags().GetString("conf")                if conf != "" {                        fmt.Println("From Create Command : ", conf)                }                data, err := ioutil.ReadFile("file.txt") // data has type []byte                if err != nil {                        log.Fatal(err)                }                var result []map[string]interface{}                json.Unmarshal(data, &result)                relays := result["relays"].(map[string]interface{})                for key, relay := range relays {                        fmt.Println("name :", relay["name"],                                "totalmem:", relay["totalmem"],                                "relaymem:", relay["relaymem"])                }        },但我收到如下错误,表明该类型无效cmd/create_relay.go:54:29:无效类型断言:结果["relays"].(map[string])(左侧为非接口类型map[string]interface {})有人可以让我知道如何使用下面的接口解析下面的 json数组json字典去
查看完整描述

2 回答

?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

它与下面的代码一起工作。


type Relays struct {

    Relays []Relay `json:"relays"`

}


type Relay struct {

    Name       string `json:"name"`

    Totalmem   string `json:"totalmem"`

    Relaymem   string    `json:"relaymem"`

}


// relayCmd represents the relay command

var createrelayCmd = &cobra.Command{

        Use:   "relay",

        Short: "A brief description of your command",

        Long: `A longer description that spans multiple lines and likely contains examples

and usage of using your command. 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.`,

        Run: func(cmd *cobra.Command, args []string) {

                fmt.Println("relay called")

                conf, _ = rootCmd.Flags().GetString("conf")

                if conf != "" {

                        fmt.Println("From Create Command : ", conf)

                        jsonFile, err := os.Open(conf)

                        // if we os.Open returns an error then handle it

                        if err != nil {

                                fmt.Println(err)

                        }

                        fmt.Println("Successfully Opened users.json")

                        // defer the closing of our jsonFile so that we can parse it later on

                        defer jsonFile.Close()

                        data, err := ioutil.ReadAll(jsonFile) // data has type []byte

                        if err != nil {

                                log.Fatal(err)

                        }

                        var relays Relays

                        json.Unmarshal(data,&relays)

                        for i := 0; i < len(relays.Relays); i++ {

                                fmt.Println("User Name: " + relays.Relays[i].Name)

                                fmt.Println("User Totalmem: " + relays.Relays[i].Totalmem)

                                fmt.Println("User Relaymem: " + relays.Relays[i].Relaymem)

                        }

                }

        },

}


查看完整回答
反对 回复 2023-07-26
?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

result在您的代码中是一个地图数组,您正在使用result["relays"]它是无效的。


你的代码应该是这样的:


Run: func(cmd *cobra.Command, args []string) {

            fmt.Println("relay called")

            conf, _ = rootCmd.Flags().GetString("conf")

            if conf != "" {

                    fmt.Println("From Create Command : ", conf)

            }

            data, err := ioutil.ReadFile("file.txt") // data has type []byte

            if err != nil {

                    log.Fatal(err)

            }

            var result map[string]interface{}

            json.Unmarshal(data, &result)

            relays := result["relays"].([]interface{})

            for _, relay := range relays {

                    relayM := relay.(map[string]interface{})

                    fmt.Println("name :", relayM["name"].(string),

                            "totalmem:", relayM["totalmem"].(string),

                            "relaymem:", relayM["relaymem"].(string))


            }

    },


查看完整回答
反对 回复 2023-07-26
  • 2 回答
  • 0 关注
  • 112 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信