将多维JSON文件映射到Go结构体

huangapple go评论91阅读模式
英文:

Mapping a multiple dimensional JSON file to a Go struct

问题

快速而简单的问题,但让我感到困惑。

Sophie.conf

{
	"host": {
		"domain": "localhost",
		"port": 5000
	}
}

main.go

...

type Config struct {
	domain string `json:"host.domain"`
	port   int    `json:"host.port"`
}

...

func loadConfig() {
	buffer, _ := ioutil.ReadFile(DEFAULT_CONFIG_FILE)
	fmt.Println(string(buffer))
	json.Unmarshal(buffer, &cfg)
}

...

然而,这样做不起作用,如果我使用以下代码打印:

fmt.Printf("host: %s:%d\n", cfg.domain, cfg.port)

输出结果为:

host: :0

我应该如何正确地实现这个功能?谢谢!

英文:

Quick and easy question no doubt, but one that has me stumped.

Sophie.conf

{
	"host": {
		"domain": "localhost",
		"port": 5000
	}
}

main.go

...

type Config struct {
	domain string `json:"host.domain"`
	port   int    `json:"host.port"`
}

...

func loadConfig() {
	buffer, _ := ioutil.ReadFile(DEFAULT_CONFIG_FILE)
	fmt.Println(string(buffer))
	json.Unmarshal(buffer, &cfg)
}

...

That doesn't work though, if I print with

fmt.Printf("host: %s:%d\n", cfg.domain, cfg.port)

The output is:

host: :0

How would I do this properly? Thanks!

答案1

得分: 3

在你的情况下,你应该声明外部的Config结构体。在其中,你应该定义Host字段,就像我示例中的匿名结构体一样,但你也可以将其提取为显式结构体。

需要注意的是,你的结构体字段应该是可导出的(大写字母开头的名称),否则json.Unmarshal(或json.Marshal)将无法正确处理数据,你可以在Play Golang上尝试使用字段。

package main

import (
  "encoding/json"
  "fmt"
)

const jsonDocument = `
{
    "host": {
        "domain": "localhost",
        "port": 5000
    }
}
`

type Config struct {
  Host struct {
    Domain string
    Port   int
  }
}

func main() {
  cfg := &Config{}
  json.Unmarshal([]byte(jsonDocument), cfg)
  fmt.Printf("host: %s:%d\n", cfg.Host.Domain, cfg.Host.Port)
}

以上是你要翻译的内容。

英文:

In your case you should declare outer Config struct. Inside it you should define Host field, in my example it is anonymous struct, but you can extract it as explicit struct.

One note — you structs' fields should be exported (Upper Case name), or json.Unmarshal (or json.Marshal) will fail to process data properly, you could experiment with fields on Play Golang.

http://play.golang.org/p/msu73bwXNb

package main

import (
  "encoding/json"
  "fmt"
)

const jsonDocument = `
{
    "host": {
        "domain": "localhost",
        "port": 5000
    }
}
`

type Config struct {
  Host struct {
    Domain string
    Port   int
  }
}

func main() {
  cfg := &Config{}
  json.Unmarshal([]byte(jsonDocument), cfg)
  fmt.Printf("host: %s:%d\n", cfg.Host.Domain, cfg.Host.Port)
}

huangapple
  • 本文由 发表于 2014年3月29日 03:55:50
  • 转载请务必保留本文链接:https://go.coder-hub.com/22722048.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定