자기 참조 구조체 요소를 사용하여 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": "" } } ] } }]
이 JSON을 Go 구조체로 표현하기 위해 다음을 정의합니다. 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" 속성에 속합니다. 또한 "복제본" 속성에는 다양한 키를 보유하는 객체가 포함된 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!