使用自引用结构元素解组 JSON
考虑以下具有嵌套结构的 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": "" } } ] } }]
为了在 Go 结构中表示此 JSON,我们定义以下内容struct:
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"` }
但是,尝试将 JSON 字符串解组到该结构的切片中会导致空切片。
问题在于 JSON 输入不是一个事实DBS 结构的切片。相反,它包含另一个 JSON 对象包装器,并且 DBS 的值属于“db”属性。此外,“replicas”属性包含一个 JSON 数组,其中包含持有不同键的对象,这些对象也可以由 DBS 结构体表示。
要完全建模此 JSON,我们需要一个动态类型,例如映射。我们需要的类型是[]map[string]DBS,它代表地图的切片。映射键可以建模任何属性名称,值是由 DBS 结构体建模的 JSON 对象。
以下示例演示如何使用此类型完全解析 JSON 输入:
import ( "encoding/json" "fmt" ) 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) }
输出:
[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”,可以进一步建模,我们可以切换为指针提高可读性。
通过理解 JSON 输入的嵌套和结构,我们可以有效地将其解组为准确表示数据的自定义结构。
以上是如何在 Go 中解组复杂的自引用 JSON?的详细内容。更多信息请关注PHP中文网其他相关文章!