我是初学者,尝试解组以下json字符串
[{
"db": {
"url": "mongodb://localhost",
"port": "27000",
"uname": "",
"pass": "",
"authdb": "",
"replicas": [
{
"rs01": {
"url":"mongodb://localhost",
"port": "27001",
"uname": "",
"pass": "",
"authdb": ""
}
},
{
"rs02": {
"url":"mongodb://localhost",
"port": "27002",
"uname": "",
"pass": "",
"authdb": ""
}
}
]
}
}]
这是结构
type DBS struct {
URL string `json:url`
Port string `json:port`
Uname string `json:uname`
Pass string `json:pass`
Authdb string `json:authdb`
Replicas []DBS `json:replicas`
}
这是功能
func loadConfigs() []DBS {
var config []DBS
raw, err := ioutil.ReadFile("./config.json")
if err != nil {
fmt.Println(err.Error())
os.Exit(1)
}
json.Unmarshal(raw, &config)
return config
}
该函数正在返回
{ []}
您的JSON输入不是的一部分DBS
,因为还有另一个JSON对象包装器,并且值DBS
属于属性"db"
。
更深入地讲,"replicaps"
是一个JSON数组,其中的对象持有不同的键,其值可由表示DBS
。
因此,要完全描述JSON,您需要某种“动态”类型。例如,地图就是这种动态类型。
因此,您的原始JSON输入可以使用类型完全建模[]map[string]DBS
。这是一张地图,因为您的JSON输入包含一个JSON数组。映射键可以对任何属性名称进行建模,并且值是由DBS
struct 建模的JSON对象。
请参见下面的示例,该示例完全解析JSON输入:
type DBS struct {
URL string `json:"url"`
Port string `json:"port"`
Uname string `json:"uname"`
Pass string `json:"pass"`
Authdb string `json:"authdb"`
Replicas []map[string]DBS `json:"replicas"`
}
func main() {
var dbs []map[string]DBS
if err := json.Unmarshal([]byte(src), &dbs); err != nil {
panic(err)
}
fmt.Printf("%+v", dbs)
}
注意正确的标记语法(例如json:"url"
)。
输出(在Go Playground上尝试):
[map[db:{URL:mongodb://localhost Port:27000 Uname: Pass: Authdb: Replicas:[map[rs01:{URL:mongodb://localhost Port:27001 Uname: Pass: Authdb: Replicas:[]}] map[rs02:{URL:mongodb://localhost Port:27002 Uname: Pass: Authdb: Replicas:[]}]]}]]
请注意,您可以进一步对始终为的第一个级别建模"db"
,并且我们可以切换到指针(在第一个示例中我使用了非指针,因此打印的结果可读):
type DBReplicated struct {
DB *DBS `json:"db"`
}
type DBS struct {
URL string `json:"url"`
Port string `json:"port"`
Uname string `json:"uname"`
Pass string `json:"pass"`
Authdb string `json:"authdb"`
Replicas []map[string]*DBS `json:"replicas"`
}
func main() {
var dbs []*DBReplicated
if err := json.Unmarshal([]byte(src), &dbs); err != nil {
panic(err)
}
db := dbs[0].DB
fmt.Printf("%+v\n", db)
for _, dbs := range db.Replicas {
for name, replica := range dbs {
fmt.Printf("%s: %+v\n", name, replica)
}
}
}
输出(在Go Playground上尝试):
&{URL:mongodb://localhost Port:27000 Uname: Pass: Authdb: Replicas:[map[rs01:0x10538200] map[rs02:0x10538240]]}
rs01: &{URL:mongodb://localhost Port:27001 Uname: Pass: Authdb: Replicas:[]}
rs02: &{URL:mongodb://localhost Port:27002 Uname: Pass: Authdb: Replicas:[]}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句