복잡한 관계가 있는 중첩 JSON 구조 풀기
JSON 데이터로 작업할 때 구조체의 한 요소 자체가 구조체. 이러한 복잡한 구조를 풀려면 JSON 구문 분석과 효율적인 데이터 모델링에 대한 이해가 필요합니다.
과제: 자기 참조 요소를 사용하여 JSON 구문 분석
다음 JSON 문자열을 고려하세요. "db" 개체에는 "db"를 미러링하는 중첩된 "복제본"이 포함되어 있습니다. 구조:
[{ "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": "" } } ] } }]
및 해당 구조 정의:
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.Unmarshal 함수를 사용하여 DBS 조각으로 변환하면 빈 결과가 발생합니다. Slice:
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 }
이는 JSON 데이터가 구조체 정의와 일치하지 않기 때문에 발생합니다. 외부 JSON 배열 래퍼와 복제본 내의 중첩된 "db" 객체는 구조체에 명시적으로 표시되지 않습니다.
해결책: 동적 JSON 구조 모델링
정확하게 표현하려면 JSON 구조에는 다양한 키와 값을 수용할 수 있는 동적 유형이 필요합니다. map[string]DBS는 이러한 동적 동작을 모델링할 수 있습니다. 여기서 키는 속성 이름을 나타내고 값은 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"` }
모델 개선: 포인터 사용
출력을 단순화하고 성능을 향상시키기 위해 표시된 것처럼 복제본 맵에서 DBS 유형에 대한 포인터를 사용할 수 있습니다. 아래:
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 구조의 복잡성을 이해하고 적절한 데이터 모델링 기술을 활용함으로써 개발자는 Golang에서 복잡한 데이터를 효과적으로 구문 분석하고 작업할 수 있습니다. 이를 통해 효율적인 데이터 조작과 계층적 데이터 구조의 정확한 표현이 가능합니다.
위 내용은 Go에서 자체 참조 요소를 사용하여 중첩된 JSON 구조를 효과적으로 구문 분석하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!