我是初学者,尝试解组以下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"。
DBS
"db"
更深入地讲,"replicaps"是一个JSON数组,其中的对象持有不同的键,其值可由表示DBS。
"replicaps"
因此,要完全描述您的JSON,您需要某种“动态”类型。例如,地图就是这种动态类型。
因此,您的原始JSON输入可以使用类型完全建模[]map[string]DBS。这是一张地图,因为您的JSON输入包含一个JSON数组。映射键可以对任何属性名称进行建模,并且值是由DBSstruct建模的JSON对象。
[]map[string]DBS
请参见下面的示例,该示例完全解析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")。
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) } } }
&{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:[]}