재귀 구조로 JSON 역마샬링
MongoDB 구성을 나타내는 다음 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": "" } } ] } }]
우리는 다음을 모델링하는 구조체 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 []DBS `json:replicas` }
그러나 json.Unmarshal을 사용하여 JSON을 역마샬링할 때 문제가 발생합니다. 프로세스 후에도 DBS 슬라이스는 비어 있습니다.
기본적인 문제는 JSON 입력에 DBS 값을 래핑하는 추가 JSON 개체가 있고 DBS 값이 "db" 개체의 속성이라는 것입니다. 또한 "복제본" 배열에는 DBS로 표시할 수 있는 다양한 키가 있는 개체가 포함되어 있습니다.
이 JSON을 정확하게 모델링하려면 "동적" 유형이 필요합니다. 지도가 적합한 옵션으로 사용됩니다. 따라서 JSON에 적합한 구조는 []map[string]DBS입니다.
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"` }
이 대체 구조는 JSON 입력을 효과적으로 구문 분석합니다.
// ... if err := json.Unmarshal([]byte(src), &dbs); err != nil { panic(err) } fmt.Printf("%+v", dbs)
출력은 JSON 구조를 나타냅니다.
게다가 포인터를 사용하고 항상 첫 번째 수준을 모델링하여 모델을 최적화할 수 있습니다. "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"` }
이 업데이트된 모델은 JSON 구성을 더욱 간결하고 효율적으로 표현합니다.
위 내용은 Go에서 동적 키를 사용하여 중첩된 JSON을 어떻게 성공적으로 역마샬링할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!