>백엔드 개발 >Golang >Go에서 동적 키를 사용하여 중첩된 JSON을 어떻게 성공적으로 역마샬링할 수 있습니까?

Go에서 동적 키를 사용하여 중첩된 JSON을 어떻게 성공적으로 역마샬링할 수 있습니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-18 09:42:22351검색

How Can I Successfully Unmarshal Nested JSON with Dynamic Keys in Go?

재귀 구조로 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.