자기 참조 요소를 사용하여 JSON 문자열을 구조체로 역마샬링
Go에서 자체 참조 요소를 사용하여 JSON 문자열을 구조체로 역마샬링 참조 요소는 어려울 수 있습니다. 이 문제를 효과적으로 해결하기 위한 구체적인 예와 솔루션을 살펴보겠습니다.
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 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"` }
함수 및 출력 비정렬화
제공된 함수 loadConfigs()는 JSON 문자열을 DBS 구조체 조각으로 역마샬링하려고 시도합니다.
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 }
그러나 이렇게 하면 빈 슬라이스 []DBS{가 생성됩니다. 입력은 DBS 구조체의 조각이 아니라 객체 배열을 포함하는 JSON 객체 래퍼입니다.
해결책: 동적 유형으로 매핑
JSON 입력을 완전히 설명하려면 , 지도와 같은 동적 유형이 필요합니다. 업데이트된 유형 정의는 다음과 같습니다.
type DBSReplicated 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 입력을 정확하게 구문 분석할 수 있습니다.
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:[]}
키 포인트
위 내용은 동적 유형을 사용하여 Go에서 자체 참조 JSON 문자열을 역마샬링하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!