您的JSON输入不是的一部分
DBS,因为还有另一个JSON对象包装器,并且值
DBS属于属性
"db"。
更深入地讲,
"replicaps"是一个JSON数组,其中的对象持有不同的键,其值可由表示
DBS。
因此,要完全描述您的JSON,您需要某种“动态”类型。例如,地图就是这种动态类型。
因此,您的原始JSON输入可以使用类型完全建模
[]map[string]DBS。这是一张地图,因为您的JSON输入包含一个JSON数组。映射键可以对任何属性名称进行建模,并且值是由
DBSstruct建模的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("%+vn", db) for _, dbs := range db.Replicas { for name, replica := range dbs { fmt.Printf("%s: %+vn", 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:[]}


